如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”。默认值到底是什么由变量类型和变量所在位置决定。
如果是内置类型(int, short等)的变量为被显示初始化,它的值由定义的位置决定。定义与任何函数体之外的变量被初始化为0,定义在函数体内部的内置变量将不被初始化,其值时未定义的。
C++11新标准规定可以为数据成员提供一个类内初始值(in-class initializer)。创建对象时,类内初始值将用于初始化数据成员,没有初始值的成员将被默认初始化。
1、类内初始值和赋值类似,或者放在花括号里(如数组),或者放在等号右边,不能使用圆括号。
2、如果在构造方法里面对赋予了类内初始值的变量再次赋值,类内初始值将被覆盖。
class Student {
public:
Student() = default;
Student(int _age):age(_age) {};
string name;
int age = 10;
int _class {3};
int grade;
void printInfo() { cout << "age:" << age << ", grade:" << grade << ", class:" << _class << endl; }
};
int main() {
Student student1;
student1.printInfo();
Student student2(12);
student2.printInfo();
return 0;
}
上述代码输出:
age:10, grade:37, class:3
age:12, grade:24, class:3
1)成员变量grade没有被初始化,其值时未定义的,可能为任何值
2)student1对象的age和_class对象均由类内初始值初始化
3)student2对象的age变量的类内初始值被构造方法传递的参数值覆盖