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;