Skip to content

Latest commit

 

History

History
339 lines (280 loc) · 13.3 KB

chapter-13-answer.md

File metadata and controls

339 lines (280 loc) · 13.3 KB
  • 练习13.1
    拷贝构造函数是类进行拷贝初始化时使用的构造函数。

  • 练习13.2
    对于该构造函数的调用会造成无限循环。

  • 练习13.3
    拷贝一个StrBlob时,拷贝了智能指针
    拷贝一个StrBlobPtr时,拷贝了智能指针和size_t类型

  • 练习13.4

  1. 这个函数被调用时
  2. local初始化时
  3. new一个指针时
    答案书中没有写这条,这条可能会调用,也可能不会调用。但即使调用,也可能是调用的拷贝构造函数进行的直接初始化,并不是拷贝初始化
  4. *heap赋值时(拷贝赋值运算符)
  5. pa数组初始化时,调用了2次
  6. return语句调用1次
  • 练习13.5
    13.5 HasPtr类 程序代码

  • 练习13.6
    拷贝赋值运算符是控制类对象拷贝时候的的函数
    在对象赋值的时候使用
    如果类未定义拷贝复制运算符时,编译器会生成一个合成的

  • 练习13.7
    与调用拷贝构造函数类似,拷贝一个StrBlob时,拷贝了智能指针
    拷贝一个StrBlobPtr时,拷贝了智能指针和size_t类型

  • 练习13.8
    添加了拷贝赋值运算符
    13.8 HasPtr类 程序代码

  • 练习13.9
    析构函数是在类对象销毁时执行的函数。
    合成的析构函数一般用来销毁类对象内的对象。
    如果类未定义自己的析构函数,编译器会合成一个。

  • 练习13.10
    销毁StrBlob对象:销毁一个shared_ptr对象。
    销毁StrBlobPtr对象:销毁一个weak_ptr对象和size_t对象。

  • 练习13.11
    添加了析构函数
    13.11 HasPtr类 程序代码

  • 练习13.12

  1. accum销毁
  2. item1销毁
  3. item2销毁
    3次析构函数调用
r1 : &&
r2 : &
r3 : &
r4 : &&
String(const String & s)

String(const String & s)
String(const String & s)

String(const String & s)
String(const String & s)
String(const String & s)
hp = hp2;
调用rhs的拷贝构造函数 HasPtr(const HasPtr & hp) 
hp2 被拷贝构造函数中的hp引用
拷贝构造函数生成一个临时对象rhs,作为赋值运算符的参数
调用赋值运算符 HasPtr & operator=(HasPtr rhs)
然后最外层的hp,也就是this指向的对象和临时对象rhs进行swap,最后再返回*this
然后被swap的临时对象rhs被调用析构函数后,自动销毁
hp = std::move(hp2);
调用rhs的移动构造函数 HasPtr(HasPtr && p) 
hp2 被移动构造函数中的p引用,用来初始化了rhs
然后hp2也就是p被置为可析构的状态
移动构造函数生成一个临时对象rhs,作为赋值运算符的参数
调用赋值运算符 HasPtr & operator=(HasPtr rhs)
然后最外层的hp,也就是this指向的对象和临时对象rhs进行swap,最后再返回*this
然后被swap的临时对象rhs被调用析构函数后,自动销毁
  • 练习13.53
    因为赋值运算符中赋值并交换的版本依然需要新创建一个临时对象,最后这个对象还要被销毁。因此效率上不是最好的。
    HasPtr类 具有类值行为的版本
    增加了自己定义的移动构造函数和移动赋值运算符
    13.53 HasPtr类 程序代码
    13.53 测试程序代码

  • 练习13.54
    会出现模糊重载的编译错误,错误信息如下:

[Error] ambiguous overload for 'operator=' (operand types are 'HasPtr' and 'HasPtr')

HasPtr类 具有类值行为的版本
同时具有复制运算符,拷贝赋值运算符,移动赋值运算符
本程序会发生编译错误
13.54 HasPtr类 错误程序代码
13.54 测试程序代码