参考资料:《C++Primer习题集(第5版)》
目的:练习定义拷贝构造函数与拷贝赋值运算符。
/*
* Employee.cpp
*
* Created on: 2016年12月17日
* Author: 苏昱洁
*/
#include <iostream>
#include <string>
using namespace std;
class Employee {
private:
static int sn;//静态变量, 用于生成每个员工唯一的证号;
string name;//员工的姓名;
int mysn;//员工唯一的证号;
public:
Employee() {mysn = sn++;}//默认构造函数;
Employee(const string &s) {name = s; mysn = sn++;}//构造函数;
Employee(Employee &e) {name = e.name; mysn = sn++;}//拷贝构造函数;
Employee &operator = (Employee &rhs) {name = rhs.name; return *this;}//拷贝赋值运算符;
const string &getname() {return name;}
int get_mysn() {return mysn;}
};
int Employee::sn = 0;//静态变量sn赋初始值;
void f(Employee &s) {//形参是实参的引用, 调用该函数时形参不会从实参得到拷贝, 不会触发拷贝构造函数;
cout << s.getname() << " " << s.get_mysn() << endl;
}
int main(int argc, char **argv) {
ios::sync_with_stdio(false);
cin.tie(NULL);
Employee a("赵"), b = a, c;//用a初始化b时, 会调用拷贝构造函数, 如果不定义拷贝构造函数, 则合成的拷贝构造函数会简单复制mysn, 会使两者的序号相同;
c = b;//当用b为c赋值时, 会调用拷贝赋值运算符, 如果不定义自己的版本, 则编译器定义的合成版本会简单复制mysn, 会使两者的序号相同;
f(a);
f(b);
f(c);
return 0;
}
/*
赵 0//只有构造函数;
赵 0
赵 0
*/
/*
赵 0//构造函数+拷贝构造函数;
赵 1
赵 1
*/
/*
赵 0//构造函数+拷贝构造函数+拷贝赋值运算符;
赵 1
赵 2
*/