c++拷贝构造函数与拷贝赋值运算符

参考资料:《C++Primer习题集(第5版)》

目的:练习定义拷贝构造函数与拷贝赋值运算符。

/*
 * Employee.cpp
 *
 *  Created on: 2016年12月17日
 *      Author: 苏昱洁
 */
#include 
#include 
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
*/

你可能感兴趣的:(c++拷贝构造函数与拷贝赋值运算符)