构造函数的初始化链表
1.构造函数体赋值
在我们创建对象的时候,编译器会自动调用构造函数给创建的对象中各个成员变量一个合适的初始值。
例如下面的代码:
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
//_year = 1997;
_month = month;
//_month = 9;
_day = day;
//_day = 21;
}
private:
int _year;
int _month;
int _day;
};
虽然说,调用这个构造函数之后,对象的各个成员变量都有了一个初始值,但是这不能叫作成员变量的初始化。这个只能叫赋值。**因为我们在初始化的时候,各个变量只能初始化一次,可是在这里却可以多次赋值。**所以,这里不能叫做初始化。
2.初始化列表
那么对于上面的情况,既然我们不叫它为初始化而叫赋值,那么对于成员变量的初始化到底是什么?
这里就引出了一个初始化列表。
初始化列表: 以一个冒号开始,接着是一个以逗号分隔的数据成员列表 ,每个成员变量后面跟着一个放在括号中的初始值或表达式。
class Date
{
public:
Date(int year, int month, int day)
:_year(year),
_month(month),
_day(day)
{}
private:
int _year;
int _month;
int _day;
};
注意:
-
每个成员变量在初始化列表中 只能出现一次,因为初始化只能初始化一次。
-
类中包含以下成员,必须在初始化列表中初始化:
-
引用成员变量
-
const成员变量
-
类类型成员(该类没有默认的构造函数)
class A { public: A(int a) :_a(a) {} private: int _a; }; class B { public: B(int c, int a) :_c(c), _b(10), _a(a) {} private: int& _c; const int _b; A _a; };
-
尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先检查初始化列表在走函数体内部。
-
成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后顺序无关。
-
3.类中的static成员
1.概念
声明为static的类成员称之为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化。
2.特性
- 静态成员为所有类对象所共享,不属于某个具体的实例。
- 静态成员变量必须在类外定义,定义时不添加static关键字。
- 类静态成员即可用类名::静态成员或者对象.静态成员。
- 静态成员没有隐藏的this指针,不能访问任何静态成员。
- 静态成员和类的普通成员一样,也有public、protected、private三种访问级别,也可以具有返回值,const修饰符等参数。
4.C++11初始化新玩法
C++11中,支持非静态成员变量在声明时,直接初始化。
class Time
{
public:
Time(int hour = 0)
:_hour(hour)
{
}
int _hour;
};
class Date
{
public:
void Display()
{
std::cout << _day << std::endl;
std::cout << _t._hour << std::endl;
std::cout << *_p << std::endl;
std::cout << _st << std::endl;
}
private:
int _day = 10;
int *_p = new int(2);
Time _t = 5;
static int _st;
};
int Date::_st = 6;