首页 > 编程语言 >C++类和对象下

C++类和对象下

时间:2023-06-28 17:33:20浏览次数:39  
标签:初始化 对象 C++ 列表 int year month 构造函数

再谈构造函数

构造函数体赋值

在实例化对象时,编译器会通过调用构造函数给对象中的各个成员变量一个合适的初始值:

class Date {
public:
	//构造函数
	Date(int year = 2023,int month = 6,int day = 5)
	{
       	//_year可以多次赋值
		_year = year;
        _year = 2024;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初始值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值

初始化列表

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式

class Date {
public:
	//构造函数
	Date(int year = 2023,int month = 6,int day = 5)
		//初始化列表
		:_year(year)
		,_month(month)
		,_day(day)
	{
	}
private:
	int _year;
	int _month;
	int _day;
};

对于对象来说,初始化列表是对象成员变量定义初始化的地方。

在定义类时,类中的成员变量只是声明并不是定义初始化。

当我们在成员变量中加上const,程序就不能正常运行了,这是因为const变量必须在定义的时候初始化,const只有一次初始化的机会,所以必须给成员变量找一个定义的位置,不然像const类型的成员不好处理。所以在C++11中规定构造函数初始化列表是成员变量定义和初始化的地方。

class Date {
public:
	//构造函数
	Date(int year = 2023, int month = 6, int day = 5)
		//初始化列表
		:_year(year)
		, _month(month)
		, _day(day)
		,_t(20) //true,初始化列表是成员变量定义的地方
	{
		_t = 30;//error,不能在构造函数体内初始化
	}
private:
//成员变量的声明
	int _year;
	int _month;
	int _day;
	const int _t = 20; //这里只是缺省值,并不是初始化
};
int main()
{
    Date d;//这里的定义是对象整体的定义
    //成员变量在构造函数的初始化列表中定义并且初始化
}

注意:

1.哪个对象调用构造函数,初始化列表就是该对象所有成员变量定义的位置,且每个成员变量在初始化列表中只能出现一次

因为任何类型的变量初始化只能进行一次,所以同一个成员变量在初始化列表中不能多次出现。

2.不管是否显式在初始化列表定义初始化成员变量,编译器对每个成员变量都会在初始化列表中进行定义初始化;当在初始化列表显式定义初始化成员变量的时候,使用初始化列表中的值。

例如当Date类的构造函数初始化列表为空时,也会先走初始化列表再走函数体。

class Date {
public:
	//构造函数
    Date(int year = 2023, int month = 6, int day = 5)
		//初始化列表为空时,也会先走这里在进入函数体
	{
	}
	/*Date(int year = 2023, int month = 6, int day = 5)
		//初始化列表
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}*/
private:
	//成员变量的声明
	int _year;
	int _month;
	int _day;
};

3.有三个变量必须在初始化列表初始化:const变量int& 变量名(引用也必须在定义的地方初始化),没有默认构造的自定义类型成员。

默认构造函数:无参的构造函数、全缺省的构造函数以及编译器自动生成的构造函数。

下面的程序中B类的构造函数不是默认构造函数,A类中的自定义类型成员变量_bb会自动调用B类的构造函数,所以在A类中的初始化列表中要定义_bbconst成员变量_c和引用成员变量_ref都要在初始化列表中定义。

class B {
public:
	//B的构造函数,不是默认构造函数
	B(int a)
		:_a(a)
	{
		cout <<  "B(int a = 20)" << endl;
	}
	//B的打印函数
	void Print()
	{
		cout << _a << endl;
	}
	//B的析构函数
	~B()
	{
		cout << "~B()" << endl;
	}
private:
	int _a = 0;
};
class A
{
public:
	A()
		:_a(2)
		,_b(2)
		,_c(3)
		//,_ref(_c)//权限的放大,不可以,_c是const类型的变量
		,_ref(_a)
		,_bb(30)
	{}
	void Print()
	{
		cout << _a << "/" << _b << "/" << _c << "/" << _ref << "/" << endl;
		_bb.Print();
	}
private:
	int _a;//声明
	int _b;
	const int _c;
	int& _ref;
	B _bb;
};
int main()
{
	A a;
	a.Print();
	return 0;
}

4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

标签:初始化,对象,C++,列表,int,year,month,构造函数
From: https://blog.51cto.com/u_15562309/6574573

相关文章

  • 面向对象程序编程6-8次PTA题目集(成绩计算系列)的总结性Blog
    1.对之前发布的6-8次PTA题目集(成绩计算系列),内容要求如下:(1)前言:总结之前所涉及到的知识点、题量、难度等情况第六次PTA题目集:知识点:此次PTA题目仅只有这一个题目,主要考的内容就是对类的使用(类似现实,对有关联的各个数据合并在一起,便于一起使用),运用正则表达式(比较苦难使用,要记住那......
  • C++ 相关系数的计算以及在图像配准领域应用演示
    相关系数(皮尔逊相关系数)公式如下 #include<iostream>#include<vector>#include<cmath>usingnamespacestd;//计算平均值doublemean(vector<double>v){doublesum=0;for(inti=0;i<v.size();i++){sum+=v[i];......
  • C++学习---qt的公有类、私有类、Q_Q、Q_D、二进制兼容
    1、二进制兼容如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的。如果不能保证库的二进制兼容性,就意味着每次发布库的新版本时,依赖该库的所有程序都必须重新编译才能正常运行。2、公有类、私有类是解决......
  • C++ 相关系数的计算以及作用
    #include<iostream>#include<vector>#include<cmath>usingnamespacestd;//计算平均值doublemean(vector<double>v){doublesum=0;for(inti=0;i<v.size();i++){sum+=v[i];}returnsum/v.si......
  • 3-IO对象
    1-常用对象名称作用属性及参数Text(str)显示文本strInput()用户输入Button(name)按钮2-实例应用importPySimpleGUIassgsg.theme('GrayGrayGray')layout=[[sg.Text('Youarewelcome!')],[sg.Text('name:'),sg.Input()],......
  • c++中static_cast用法
    static_cast是指显性类型强制转换,如: 结果为a=120.和C语言学习时的显性意义一样,但是编译器会对此类型转换进行检查。另外还有另外3种转换:const属性用const_cast。基本类型转换用static_cast。多态类之间的类型转换用daynamic_cast。不同类型的指针类型转换用reinterprete......
  • C++入门
    c++入门--变量与基本类型如果你还没有接触过编程,想先体验一下编程的乐趣。请看我的c++入门(1)--输入输出,代码运行顺序及其控制。此文开始学习变量以及基本类型。原始内置类型(PrimitiveBuild-inTypes)两类:算术类型(arithmetictypes)和void。我们主要讲解算术类型。算术类型(Arithmetic......
  • python基础--面向对象
    1、类的写法class类名():代码... 类的创建例子classTest():#函数的构造方法def__init__(self,name):self.__name=name#这个是表示内部类的属性def__innerMethod(self):print('thisisinnermethod')#self相......
  • C++ 命名空间
     假设这样一种情况,当一个班上有两个名叫Zara的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。同样的情况也出现在C++应用程序中。例如,您可能会写一个名为xyz()的函数,在另一个可用的库中也存在一个相同的......
  • C/C++自助点餐系统[2023-06-28]
    C/C++自助点餐系统[2023-06-28]面向对象程序课程设计任务书【题目】自助点餐系统【目的】通过设计一个小型的自助点餐系统,训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念,使自己的程序设计与调试水平有一个明显的提高。【要求】1、每个学生必须独立完成;......