首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++关于构造函数初始列表的有关问题

2013-08-13 
c++关于构造函数初始列表的问题第四版的C++ primer中有这样一句话:“初始化const或引用类型数据成员的唯一

c++关于构造函数初始列表的问题
第四版的C++ primer中有这样一句话:“初始化const或引用类型数据成员的唯一机会是构造函数初始化列表中。”难道不能在构造函数的函数体中实现吗?还有一点不明白,就是构造函数的初始化列表是怎样工作的?比如:


class ConstRef {
    public:
        ConstRef(int ii);
    private:
        int i;
        const int ci;
        int &ri;
};
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) {}

上例中的初始化列表是如何工作的呢? C++ 构造函数 初始化列表
[解决办法]
因为const和引用都要在定义的同时就给初值
[解决办法]
引用:
第四版的C++ primer中有这样一句话:“初始化const或引用类型数据成员的唯一机会是构造函数初始化列表中。”难道不能在构造函数的函数体中实现吗?还有一点不明白,就是构造函数的初始化列表是怎样工作的?比如:

class ConstRef {
    public:
        ConstRef(int ii);
    private:
        int i;
        const int ci;
        int &ri;
};
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) {}

上例中的初始化列表是如何工作的呢?


什么叫如何工作的,就是在创建对象的时候,为成员变量分配空间的同时用括号里的值初始化它啊
[解决办法]
“初始化const或引用类型数据成员的唯一机会是构造函数初始化列表中。”难道不能在构造函数的函数体中实现吗?
-----------------------------------
很简单呀,自己做个简单的小程序试验一下便知。

还有一点不明白,就是构造函数的初始化列表是怎样工作的?
-----------------------
按照类定义中声明的成员变量的次序初始化,
不是按照初始化列表的顺序初始化。
你的例子中,初始化的顺序是 i , ci , ri 
[解决办法]
看看标准12.6.2 Initializing bases and members
[解决办法]
因为在调用constructor的主体之前,所有成员的初始化函数都会被调用一遍。即使你不写初始化列表,那些成员也会按无参数的默认构造函数去构造。如果某个成员没有默认构造函数,你也没有在初始化列表里调用它的某个构造函数,就会抛出一个编译时错误。


[解决办法]


无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,

最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,

没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值。


http://blog.csdn.net/todototry/article/details/1480055
[解决办法]
引用:
Quote: 引用:

因为const和引用都要在定义的同时就给初值

是不是这样理解:const和引用的值一旦被初始化,便不能被改变。而构造函数分两个执行阶段:(1)初始化阶段 (2)普通的计算阶段。其中计算阶段由构造函数体中的所有语句组成。如果const和引用的值是在构造函数体中实现的话,相当于被赋值了两次。违反了const和引用的定义。
好想知道const和引用的值为什么只能被初始化一次?在底层是怎样实现这种特殊功能的?


底层没有这个功能,这是编译时检查的
[解决办法]
不能,首先你要弄清楚一个类的构造过程,先要构造出类的各个成员,然后才调用本类的构造函数。所以,在执行构造函数时,各个成员已经构造完毕,而初始化列表是用于在构造成员时提供参数,所以初始化列表的使用是在构造成员的时候,也就是在调用本类的构造函数之前。
举个例子,假定你的类定义如下:

class MyClass
{
public:
     MyClass(const A& a1, const B& b1) : a(a1), b(b1) {}
     //MyClass(const A& a1, const B& b1) {this->a = a1; this->b = b1;}
private:
      A a;
      B b;
};

假定类型 A 和类型 B 都拥有默认构造函数和复制构造函数,如果采用上面没有被注释的那个构造函数,那么执行顺序为:

A::A(const A& a1) {}      // A 类型的复制构造函数
B::B(const B& b1) {}      // B 类型的复制构造函数
MyClass::MyClass(const A& a1, const B& b1)    // 本类的构造函数

如果采用下面那个被注释掉的构造函数,那么执行顺序为:

A::A() {}     // A 类型的默认构造函数
B::B() {}     // B 类型的默认构造函数
MyClass::MyClass(const A& a1, const B& b1)    // 本类的构造函数
A& A::operator=(const A& a1) {}    // A 类型的赋值运算符重载函数
B& B::operator=(const B& b1) {}    // B 类型的赋值运算符重载函数

[解决办法]
引用:
Quote: 引用:

看看标准12.6.2 Initializing bases and members

没有。哪里能下载?名字是什么?

c++ 0x 草稿版,和正式版(正式版需要付费才能下载)差不多。

热点排行