第十三章

13.1

拷贝(复制)构造函数和赋值函数区别:

        调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。

        换句话说,就是初始化时调用的是拷贝构造函数,赋值时调用赋值操作。

        复制初始化首先使用指定构造函数创建一个临时对象(第 7.3.2 节),然后用复制构造函数(不是赋值操作符)将那个临时对象复制到正在创建的对象:

string null_book = "9-999-99999-9";     // copy-initialization
string dots(10, '.');                   // direct-initialization
string empty_copy = string();           // copy-initialization
string empty_direct;                    // direct-initialization

        创建 dots 时,调用参数为一个数量和一个字符的 string 构造函数并直接初始化 dots 的成员。创建 null_book 时,编译器首先调用接受一个 C 风格字符串形参的 string 构造函数, 创建一个临时对象, 然后, 编译器使用 string 复制构造函数将 null_book 初始化为那个临时对象的副本。 empty_copy 和 empty_direct 的初始化都调用默认构造函数。对前者初始化时,默认构造函数函数创建一个临时对象,然后复制构造函数用该对象初始化empty_copy。对后者初始化时,直接运行 empty_direct 的默认构造函数

初始化容器元素
// default string constructor and five string copy constructors invoked
vector<string> svec(5);

        编译器首先使用 string 默认构造函数创建一个临时值来初始化 svec,然后使用复制构造函数将临时值复制到 svec 的每个元素。

合成的复制构造函数:

        如果我们没有定义复制构造函数,编译器就会为我们合成一个。与合成的默认构造函数不同即使我们定义了其他构造函数,也会合成复制构造函数。 合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。其中每个数据成员在构造函数初始化列表中进行初始化 。

13.1.3. 禁止复制 
        有些类需要完全禁止复制。例如,iostream 类就不允许复制 ,为了防止复制,类必须显式声明其复制构造函数为 private。然而,类的友元和成员仍可以进行复制。如果想要连友元和成员中的复制也禁止,就可以声明一个(private)复制构造函数但不对其定义。 用户代码中复制尝试将在编译时标记为错误,而成员函数和友元中的复制尝试将在链接时导致错误。

13.3

        动态分配的对象只有在指向该对象的指针被删除时才撤销。如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象就一直存在,从而导致内存泄漏,而且,对象内部使用的任何资源也不会释放。

        与复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数 析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行

class Sales_item {
public:
// empty; no work to do other than destroying the members,
// which happens automatically
~Sales_item() { }
// other members as before
};

        撤销 Sales_item 类型的对象时,将运行这个什么也不做的析构函数,它执行完毕后,将运行合成析构函数以撤销类的成员。合成析构函数调用 string 析构函数来撤销 string 成员,string 析构函数释放了保存 isbn 的内存。units_sold 和 revenue 成员是内置类型, 所以合成析构函数撤销它们不需要做什么。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值