zoukankan      html  css  js  c++  java
  • C++,对象的 =赋值 以及 复制构造函数赋值

    1. C++默认实现了 = 号赋值;operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可。

    2. C++默认实现了复制构造函数;同样,只要将一个对象的内容的内容逐位复制给另外一个对象即可。

    3. 默认实现的复制构造函数属于浅拷贝。当对象里面有指针的时候,第二个对象的指针并没有重新分配空间,这时如果析构函数delete了这个指针,会造成重复delete。

    这个时候,要自己实现复制构造函数,在构造函数中new重新分配空间,并可用memcpy手动复制该空间的值。

    4. = 号操作符也可以自己实现;

    使用默认的 = 操作符以及默认的复制构造函数的例子:

    #include <iostream>
    using namespace std;
    
    class Demo
    {
    public:
        int x ;
        int y ; 
    };
    
    int main()
    {
        Demo demo1;
        demo1.x = 11;
        demo1.y = 111;
    
        Demo demo2;
        demo2 = demo1;//默认的等号赋值,属于浅拷贝。但对象成员没有指针变量时,无需顾虑。
        cout<<"demo2-----"<<demo2.x<<endl;
        cout<<"demo2-----"<<demo2.y<<endl;
    
        Demo demo3(demo1);//默认的复制构造函数,属于浅拷贝。可以自己实现,Demo::Demo(Demo& val);
        cout<<"demo3-----"<<demo3.x<<endl;
        cout<<"demo3-----"<<demo3.y<<endl;
    
        while(1);
        return 0 ;
    }

    /**结果:

    demo2 x-----11
    demo2 y-----111
    demo3 x-----11
    demo3 y-----111

    */

    下面是自己实现复制构造函数的例子:

    #include <iostream>
    using namespace std;
    
    class Demo
    {
    public:
        int x ;
        int y ; 
        Demo();
        Demo(Demo& val);
    };
    
    Demo::Demo()
    {
    
    }
    Demo::Demo(Demo& val) //自己实现拷贝构造函数 
    {
        this->x = val.x +1;//故意+1以示区分
        this->y = val.y +1;
    }
    
    int main()
    {
        Demo demo1;
        demo1.x = 11;
        demo1.y = 111;
    
        Demo demo2;
        demo2 = demo1;//等号赋值,属于浅拷贝
        cout<<"demo2 x-----"<<demo2.x<<endl;
        cout<<"demo2 y-----"<<demo2.y<<endl;
    
        Demo demo3(demo1);//
        cout<<"demo3 x-----"<<demo3.x<<endl;
        cout<<"demo3 y-----"<<demo3.y<<endl;
    
        while(1);
        return 0 ;
    }
    /*测试结果:
    demo2 x-----11
    demo2 y-----111
    demo3 x-----12
    demo3 y-----112
    */
  • 相关阅读:
    Chapter1-data access reloaded:Entity Framework(上)
    Part1-Redefining your data-access strategy 重新定义你的数据访问策略
    ora-12541无监听的一种场景
    GridView根据一列自动计算(转载)
    百度Fex webuploader.js上传大文件失败
    JS文件中引用另一个JS文件
    连接虚拟机的SQLServer
    Spring中Bean的生命周期
    Spring中Bean的作用范围调整
    Spring中三种创建Bean对象的方式
  • 原文地址:https://www.cnblogs.com/mylinux/p/4092245.html
Copyright © 2011-2022 走看看