您的位置:首页 > 编程语言 > C语言/C++

C++构造函数,复制构造函数,赋值操作符

2015-07-22 20:56 316 查看
构造函数:

当我们没有声明一个构造函数时,编译器就有可能为我们合成一个,用于初始化一些拥有构造函数的基类或者自身的成员变量,如果自身或者父类含有虚函数,也需要为每一个对象生成vptr,这时也会产生一个默认构造函数 。当含有虚基类的时候,也需要有指向虚拟基类对象的指针生成,这个也是编译器在构造对象期间完成。上面所说的这些,都需要相应的代码支持,要么合成一个默认构造函数包含这些代码,在已经有声明构造函数时,编译器则会扩张已有的函数,将这些代码添加进去。

总之编译器会确保我们的对象在生成后拥有适当的值。而这些是通过扩展构造函数或生成默认构造函数实现的。

复制构造函数:

当我们没有定义复制构造函数时,编译器会对内建或派生的data member实行拷贝,但是并不会拷贝其中的member class object,而是以递归的方式实行memberwise initialization。

总之,自己生成的复制构造函数会使内建成员获得相应的对应的值。



这段话显示出,当我们的类中含有reference或const成员时,不能期望编译器帮我们合成赋值操作符。因为这两种成员不允许重新赋值,而编译器默认的行为也就是直接cpy,所以不行。所以我们必须定义自己的copy函数,然后在自己定义的函数中,不对这些成员做处理就好。

当其基类含有一个private的赋值操作符时,说明其基类是禁止赋值的。所以在这种情况下,子类也是不能赋值的。

复制构造函数和赋值操作符:复制构造函数当你没有明确调用基类的构造函数时,编译器为了确保所有成员都已经经过初始化,会调用默认构造函数。但是当我们自己写赋值操作符时,我们如果没有自己对基类的赋值操作符进行调用的话,编译器并不会为我们进行调用,他并不企图修改其base class的成员变量,所以那些成员变量保持不变。





当我们编写一个copying函数,要确保复制所有local成员变量,调用所有base class内适当的copying函数。



虚基类的实现:可以将其放在最后,然后通过一个偏移指出来。这样就允许两个含有虚基类对象进行bitwise copy。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: