练习13.6
其实就是“=”运算,也就是赋值运算。右侧运算对象作为显示参数向左侧传递时时候。合成拷贝赋值运算符来禁止该类型对象的赋值。当一个类没有定义自己的拷贝赋值运算符的时候,编译器会为它自动生成一个合成拷贝赋值运算符。
练习13.7
将一个StrBlob赋值给另一个StrBlob这个操作是完全没有问题的。
当赋值StrBlobPtr的时候就会出错,在编译的时候就会报错,左右值的类型不一样(也不是继承关系),无法完成赋值。
练习13.8
1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using namespace std; 6 7 8 class HasPtr { 9 friend ostream &print(ostream &os, HasPtr &h); 10 public: 11 HasPtr(const string &s = string()) : ps(new string(s)), i(0) {} 12 HasPtr(const HasPtr &ptr); 13 HasPtr &operator=(const HasPtr &pt); 14 private: 15 string *ps; 16 int i; 17 }; 18 19 ostream &print(ostream &os, HasPtr &h); 20 21 int main() 22 { 23 HasPtr has("hello"); 24 HasPtr have = has; 25 print(cout, have); 26 system("pause"); 27 return 0; 28 } 29 30 HasPtr::HasPtr(const HasPtr & ptr) : ps(new string(*(ptr.ps))),i(ptr.i) {} 31 32 HasPtr & HasPtr::operator=(const HasPtr & pt) 33 { 34 ps = new string(*pt.ps); 35 i = pt.i; 36 return *this; 37 // TODO: 在此处插入 return 语句 38 } 39 40 ostream & print(ostream & os, HasPtr & h) 41 { 42 os << *h.ps << h.i << endl; 43 return os; 44 // TODO: 在此处插入 return 语句 45 }
时间: 2024-09-30 15:46:56