1.c++变量的初始化方式
首先把需要初始化的成员变量分为几类:
a.一般变量(int)
b.静态成员变量(static int)
c.常量(const int)
d.静态常量(static const int)
对应的初始化方式是:
a.一般变量可以在初始化列表里或者构造函数里初始化,不能直接初始化或者类外初始化
b.静态成员变量必须在类外初始化
c.常量必须在初始化列表里初始化
d.静态常量必须只能在定义的时候初始化(定义时直接初始化)
举一个简单的例子:
#include <iostream>
#include <string>
using namespace std;
class Test
{
private:
int a;
static int b;
const int c;
static const int d=4;
public:
Test():c(3) //a(1)或者在初始化列表里初始化
{
a=1;
}
};
int Test::b=2;
void main()
{
Test t;
}
这里之前不知道什么是初始化列表。
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:
class CExample{
public:
int a;
float b;
//构造函数初始化列表
CExample():a(0), b(8.8)
{}
//构造函数内部赋值
CExample()
{
a = 0;
b = 8.8
}
};
上面的例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显式的初始化。
初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:
1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
2.const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。