本文通过文件读写来实现每生成一个对象给予一个唯一序号,可做到每次运行可执行文件生成的序号也互相不同。
numbered类:(拷贝赋值运算符与题目要求无关,不影响进程输出,used.txt初始为0)
class numbered
{
public:
/*默认构造函数*/
numbered()
{
MakeMysn();
}
/*拷贝构造函数*/
numbered(const numbered &)
{
MakeMysn();
}
/*拷贝赋值运算符*/
numbered & operator=(numbered & n)
{
MakeMysn();
return n;
}
unsigned int mysn;
private:
void MakeMysn()
{
ifstream ifs("../used.txt"); // 只读方式打开存入对象唯一序号的文件
ifs >> mysn; // mysn保存序号
ofstream ofs("../used.txt"); // 清零重写方式打开存入对象唯一序号的文件
ofs << mysn + 1; // 更新序号并写入存入对象唯一序号的文件
}
};
13.14输出结果:
ldl@ldl-virtual-machine:~/CppPrimer/bin$ ./main
0
0
0
分析:numbered a, b = a, c =a:中只a调用默认构造函数1次,中定义时用 = 调用合成拷贝构造函数mysn为赋予唯一标号。mysn更新为1。
f(a); f(b);f(c):非引用传参,发生拷贝,调用合成拷贝构造函数,mysn不更新。
13.15输出结果:
ldl@ldl-virtual-machine:~/CppPrimer/bin$ ./main
4
5
6
分析:numbered a, b = a, c = b:中定义时用 = 调用默认构造函数1次,拷贝构造函数两次mysn,mysn更新为4;
f(a); f(b);f(c):非引用传参,发生拷贝,调用拷贝构造函数,打印的是拷贝副本numbered的为一标号,mysn更新为7。
ldl@ldl-virtual-machine:~/CppPrimer/bin$ ./main
7
8
9
分析:numbered a, b = a, c = b:同上mysn更新为10;
f(a); f(b);f(c);引用传参,不发生拷贝,打印的是abc定义初始化时各自更新的值,mysn不更新。