构造函数初始化成员列表(constructor initializer list)
如果CMember是另一个类的成员,你怎样初始化它呢?答案是你必须使用成员初始化列表。
01.
class
CMyClass {
02.
CMember m_member;
03.
public
:
04.
CMyClass();
05.
};
06.
// 必须使用初始化列表来初始化成员 m_member
07.
CMyClass::CMyClass() : m_member(2)
08.
09.
{
10.
•••
11.
}
没有其它办法将参数传递给m_member,如果成员是一个常量对象或者引用也是一样。根据C++的规则,常量对象和引用不能被赋值,它们只能被初始化。
在它们之间有什么不同吗?是的。编译器总是确保所有成员对象在构造函数体执行之前被初始化,因此在第一个例子中编译的代码将调用CString::Cstring来初始化m_str,这在控制到达赋值语句前完成。在第二个例子中编译器产生一个对CString:: CString(LPCTSTR)的调用并将"Hi,how are you."传递给这个函数。结果是在第一个例子中调用了两个CString函数(构造函数和赋值操作符),而在第二个例子中只调用了一个函数。
初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。对非内置类型成员变量,为了避免两次构造,推荐使用类构造函数初始化列表。但有的时候必须用带有初始化列表的构造函数:1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。2.const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
#include#include using namespace std;class Person{public: Person(const string &Name, const string &Address); string get_name() const; string get_address() const;private: string name; string address; const int born_year;};Person::Person( const string &Name, const string &Address):name(Name),address(Address),born_year(2){// born_year = 0; // wrong! constant member must be initialized in list, can not be assigned// this->name = Name;// this->address = Address;}string Person::get_name() const{ return name;}string Person::get_address() const{ return address;}int main(){ string na = "shi"; string add = "Nouyok"; Person per(na, add); cout << per.get_address() << endl; return 0;}
引用类成员???
必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。
呵呵,头文件里确实不是初始化的地儿。 引用类型是在初始化列表里赋值的。比如你在头文件里这样写: class C { public: C(); public: int &x; int y; }; 然后在源文件中写: C::C() : x(y) { } 这样就可以将x跟y关联上了。