博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造函数初始化列表
阅读量:6617 次
发布时间:2019-06-25

本文共 1840 字,大约阅读时间需要 6 分钟。

 

 

构造函数初始化成员列表(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;}
View Code

 

  引用类成员???

必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。

 

 

呵呵,头文件里确实不是初始化的地儿。 引用类型是在初始化列表里赋值的。比如你在头文件里这样写: class C {
public: C(); public: int &x; int y; }; 然后在源文件中写: C::C() : x(y) {
} 这样就可以将x跟y关联上了。

转载于:https://www.cnblogs.com/jiangyoumiemie/archive/2013/06/06/3120774.html

你可能感兴趣的文章
Exchange Server 2013 系列八:邮箱服务器角色DAG实战
查看>>
php使用curl下载指定大小的文件
查看>>
VS2013创建Node.js C++ Addons的过程
查看>>
amaze ui中的icon button
查看>>
tcp 三次握手
查看>>
XML中添加换行符
查看>>
在C#中使用属性控件添加属性窗口
查看>>
printf()详解之终极无惑
查看>>
交叉检验---训练数据,验证数据和测试数据
查看>>
AspNetPager分页控件配置
查看>>
第 8 章 Spring Data
查看>>
[裴礼文数学分析中的典型问题与方法习题参考解答]5.1.24
查看>>
C语言 编程练习22题
查看>>
Log4Net 生成多个文件、文件名累加解决方法
查看>>
oracle 包,函数,过程,块的创建和执行及在java中执行(转)
查看>>
CloudDBA现场助力双十一
查看>>
虚拟现实技术或会产生副作用
查看>>
【云图】如何设置微信里的全国实体店地图?
查看>>
db file async I/O submit 等待事件优化
查看>>
前端需要了解的 SSO 与 CAS 知识
查看>>