• 49.【拷贝构造函数与重载】


    9d39ab32fa694ebb98708b752a3dd31d.png

     【没有明确提供拷贝构造函数的时候回调用默认的拷贝构造函数】

    cfbae4889fcd41edb9dedbad06456d3b.png

     

    #include
    #include
    using namespace std;
    class Student
    {
    private:
        int number;
        string name;
    public:
        Student(int nu, string na) :number(nu), name(na) {}
        Student() {}
        void show()
        {
            cout << "学生的学号是:" << number << "学生的姓名是:" << name << endl;
        }

    };
    int main()
    {
        Student s(21032114, "李威涛");
        Student s1 = s;                   //   利用初始化的方法
        s1.show();
        cout << "***********************" << endl;
        Student s2(s);                      //    利用小括号的方法赋值
        s2.show();
        return 0;

    }

    294ed64dbde54bc1b8fcfb5b6d9344c8.png

     =============

    【明确提供拷贝构造函数时】

    #include

    #include

    using namespace std;

    class Student

    {

    private:

     int number;

     string name;

    public:

     Student(int nu, string na) :number(nu), name(na) {}

     Student() {}

     Student(const Student& s) //拷贝构造函数要用用引用 ,因为引用值传递形参改变实参也改变

     {

      number = s.number;

      name = s.name;

     }

     void show()

     {

      cout << "学生的学号是:" << number << "学生的姓名是:" << name << endl;

     }

     

    };

    int main()

    {

     Student s(21032114, "李威涛");

     Student s1 = s; // 利用初始化的方法

     s1.show();

     cout << "***********************" << endl;          

     Student s2(s); // 利用小括号的方法赋值

     s2.show();

     return 0;

    }

    c55c641bfa584f809ae347587109d642.png

     =============

    【拷贝构造函数与重载运算符函数】

    (为什么要返回对象名,实际上是在用拷贝构造函数)

    #include
    using namespace std;
    class Complex
    {
    private:
        double real;
        double imag;
    public:
        Complex(double r, double i) :real(r), imag(i) { cout << "调用了构造函数" << endl; }
        Complex() {}
        Complex(const Complex& c)
        {
            real = c.real;
            imag = c.imag;
            cout << "*************调用了拷贝构造函数:************" << endl;
        }
        Complex operator+(Complex& c)
        {
            cout << "*************调用了重载运算符**********" << endl;
            Complex c1;
            c1.real = real + c.real;     //    返回对象的实部=原实部+引用实部;
            c1.imag = imag + c.imag;
            return c1;                    //返回对象名,其实是想用拷贝函数
        }
        void show()
        {
            cout << "加到一起是:" << real << "+" << imag << "i" << endl;
        }
    };
    int main()
    {
        Complex c(2, 3), c1(c);
        c1.show();
        Complex c2(3, 4), c3(2, 5),c4;
        c4 = c2.operator+(c3);          //  实际上为: c4=c1(real,imag);
        
        c4.show();
    }

    8c3538d8947e4399a189bfbcf359f9c8.png

     978b16d459cd40bf81cbe5ab2150a2df.png

    =============

     【在重载运算符的时候,如果不调用新的对象,要返回*this】

    74520cbbdb034dcc87d47d3b5b04e116.png

     #include

    using namespace std;

    class Complex

    {

    private:

     double real;

     double imag;

    public:

     Complex(double r, double i) :real(r), imag(i) { cout << "调用了构造函数" << endl; }

     Complex() {}

     Complex(const Complex& c)

     {

      real = c.real;

      imag = c.imag;

      cout << "*************调用了拷贝构造函数:************" << endl;

     }

     Complex operator=(Complex& c)

     {

      cout << "*************调用了重载运算符**********" << endl;

      

       real = c.real; // 返回对象的实部=原实部+引用实部;

        imag = c.imag;

        return *this; //临时变量后面会消失

     }

     void show()

     {

      cout << "加到一起是:" << real << "+" << imag << "i" << endl;

     }

    };

    int main()

    {

     Complex c(2, 3), c1(c);

     c1.show();

     Complex c2(3, 4), c3(2, 5),c4;

      c2.operator=(c3); //  

      c2.show();

    }

    bd8ebcd33d0e46538ff9f7fc3cd255d5.png

     b7935f3b42c74747908d01a4d055c2c3.png

    =============

    【注意事项】

    2c745b9e890e4d108446efab20a2c211.png

     

  • 相关阅读:
    使用IDEA开发JavaWeb项目的基本配置最新教程
    一篇文章搞懂MySQL的order by
    JOSEF约瑟 JJKY-30(JY82)检漏继电器 面板安装 0.1-50A 380V配零序互感器
    【JAVA数据结构】JAVA数据结构必备知识:泛型与包装类
    我的这个c++程序到底是怎么了?(相关搜索:for循环|主线程)
    4.1 数据仓库基础与Apache Hive入门
    Docker基本使用
    Pinia基础知识
    [C++从入门到精通] 9.inline、const、mutable、this和static
    [网络]--->网络相关名词,网关,子网掩码...
  • 原文地址:https://blog.csdn.net/qq_69683957/article/details/126084478