C++primer 13.1.4节练习

本文探讨了C++中拷贝构造函数与引用传递的区别,通过具体实例展示了不同情况下对象数据成员的变化情况,并分析了拷贝构造函数和引用在实际应用中的行为差异。

练习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

上述代码已经贴出

转载于:https://www.cnblogs.com/wuyinfenghappy/p/7463611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值