c++ primer 13.1.4节练习(合成的拷贝构造函数与自定义拷贝函数区别)

13.1.4节练习

目的:Numbered类使每个对象都有唯一的标号

情况1:使用合成的拷贝构造函数

#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;

class Numbered{
public:
	Numbered(){ mySeq = num++; }//构造函数
	int mySeq;
	//Numbered(const Numbered& i){ mySeq = num++; }
private:
	static int num;//静态成员,在类内声明,一般在类外定义。
	
};

//静态成员类外定义
int Numbered::num = 0;//static关键字只在类内声明时出现,不能在定义时重复static关键字

void f1(Numbered s)
{
	cout << s.mySeq << endl;
}

void f2(const Numbered& s)
{
	cout << s.mySeq << endl;
}
int main()
{
	Numbered a, b=a, c=b;
	f1(a);
	f1(b);
	f1(c);

	system("pause");
	return 0; 
}
结果如下:


分析:合成的拷贝构造函数是将各对象的成员简单的拷贝,即比如Numbered b=a; 实际上执行的是

b.mySeq=a.mySeq;

故a,b,c的mySeq都是0;并且在函数f1传递实参时,也发生了拷贝构造函数。


情况2:使用自定义拷贝构造函数,非引用传递参数。

即加上

Numbered(const Numbered& i){ mySeq = num++; }
结果如下:


分析:使用自定义拷贝构造函数之后

Numbered a, b=a, c=b;
a b c的mySeq分别是0,1,2都是唯一的。

而在调用f1(),又发生了拷贝构造函数。造成形参的mySeq分别是3 4 5,结果打印3 4 5,而非 0 1 2;

此时不难看出num此时为6.


情况3:使用自定义拷贝构造函数,引用传递参数。

即:

        f2(a);
	f2(b);
	f2(c);
此时调用f2函数时,不会发生拷贝。故打印结果0 1 2

结果:


这是正确的定义。



注意:使用静态成员时

1.static关键字只用在类内声明时用,在类外定义时不能重复static关键字。

2.静态成员一般在类外定义,类内初始化时用字面值常量。

3.使用静态成员时可以用类作用域符号如 int Numbered::num=0;或者用. Numbered a; a.num=0;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章