练习13.14
程序输出的是number类的mysn成员,但是number使用的是合成的拷贝控制成员,所以输出的结果都是一样,都是对象a的mysn数据成员。
练习13.15
如果在自定义的拷贝构造函数中改变了mysn的值,那么结果就会发生改变。
练习13.16
1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using namespace std; 6 7 static int i; 8 9 class numbered { 10 friend void f(numbered s); 11 friend ostream &print(ostream &os, numbered &s); 12 public: 13 numbered() : mysn(i++) { cout << "default" << endl; } 14 numbered(const numbered &n) : mysn(i++) { cout << "copy" << endl; } 15 private: 16 int mysn; 17 }; 18 19 void f(numbered s); 20 ostream &print(ostream &os, numbered &s); 21 22 int main() 23 { 24 numbered a, b; //此处的f函数输出的并不是对象a和b的数据成员,而是a和b拷贝的临时量的数据成员 25 print(cout, a); 26 print(cout, b); 27 f(a); 28 f(b); 29 numbered c(a); 30 print(cout, c); 31 f(c); 32 system("pause"); 33 return 0; 34 } 35 36 void f(numbered s) 37 { 38 cout << s.mysn << endl; 39 } 40 41 ostream & print(ostream & os, numbered & s) 42 { 43 os << s.mysn << endl; 44 return os; 45 // TODO: 在此处插入 return 语句 46 }
练习13.16
1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using namespace std; 6 7 static int i; 8 9 class numbered { 10 friend void f(const numbered &s); 11 friend ostream &print(ostream &os, numbered &s); 12 public: 13 numbered() : mysn(i++) { cout << "default" << endl; } 14 numbered(const numbered &n) : mysn(i++) { cout << "copy" << endl; } 15 private: 16 int mysn; 17 }; 18 19 void f(const numbered &s); 20 ostream &print(ostream &os, numbered &s); 21 22 int main() 23 { 24 numbered a, b; 25 f(a); 26 f(b); 27 numbered c(a); 28 f(c); 29 system("pause"); 30 return 0; 31 } 32 33 void f(const numbered &s) 34 { 35 cout << s.mysn << endl; 36 } 37 38 ostream & print(ostream & os, numbered & s) 39 { 40 os << s.mysn << endl; 41 return os; 42 // TODO: 在此处插入 return 语句 43 }
因为此时拷贝构造函数传入的不再是对象的拷贝而是对象的引用,所以其输出的值也不是临时对象的数据成员,而是原本的数据成员。
练习13.17
上述代码已经贴出