来源:给类内普通成员赋值,写成成员函数为其赋值
只有静态常量整型才能初始化!!!
形式:类名(参数列表){} //无返回值
作用:对数据成员赋初始值
调用:对象定义的时候
栈区对象
CStu stu(12, 12.3f); //构造函数参数传递
堆区对象 :声明指针并不会调用构造函数,new空间的时候调用
CStu* stu1 = new CStu(13, 13.4f);
类型
1、默认构造函数:什么都不做;只要用户声明构造函数,默认的构造函数就没有了
2、无参数
3、有参数构造函数: 通过对象传递 可以指定默认值
4、多个构造函数构成重载
成员函数定义
1、类内定义
2、类外 类内声明:意义是用于多文件
类外定义
class CStu
{
public:
int age;//只有静态常量整型才能初始化,这是普通成员
float f;
//类初始化函数 自动调用
//类名() {}
CStu()//没有返回值 对象创建过程中调用的
{
age = 12;
f = 12.23f;
}
void fun()
{
age = 12;
f = 12.23f;
}
};
int main()
{
//CStu stu; //作用 执行时间 栈区对象
CStu* stu1 = new CStu;//堆区对象 指针对象 不会调用构造函数 只有new对象之后才是调用空间的过程
//stu.fun();
//cout << stu.age << stu.f << endl;//对象成员未初始化未初始化的值输出会崩溃,
system("pause");
return 0;
}
初始化列表
初始化与赋值的区别
意义上:初始化是一个变量或者对象产生之时就赋予一个初始值,伴随性质
赋值是一个变量或者对象产生之后的任意时刻可以赋予一个值,随意性质
宏观代码上:基本数据类型:作用相同
数组,结构体:初始化和赋值的形式不同
作用相同
引用,const:只能初始化
不能赋值
函数定义和声明
形式
构造函数之后加个冒号:a(1),b(2)
不是花括号之后
作用
跟构造函数的区别:基本数据类型,用哪个都行
引用,const必须用初始化列表
对数据成员进行初始化:可通过数值对数据成员初始化
可通过构造函数参数对数据成员进行初始化
可通过成员之间相互初始化
成员初始化的顺序
初始化的方式很多,根据自己的需要用(后续还会提到)
执行顺序:在构造函数之前
引用和const
引用:引用成员
引用参数
引用类外
const:参数
常量
注意点:多个构造函数,初始化列表绑定所在的构造函数
数组和结构体如何使用初始化列表
数组
CStu() : arr() VC++无效果
Visual Studio有效果
通常设置数组元素全为0的方法 memset
for循环
结构体:可直接赋值
用初始化列表反而增加了复杂性