美文网首页
c++拷贝构造函数与拷贝赋值运算符

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

作者: 科学旅行者 | 来源:发表于2016-12-17 09:44 被阅读17次

    参考资料:《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
    */
    

    相关文章

      网友评论

          本文标题:c++拷贝构造函数与拷贝赋值运算符

          本文链接:https://www.haomeiwen.com/subject/sbuomttx.html