苏坡莱斯
2016-04-19 14:49
采纳率: 50%
浏览 1.4k

关于复制构造函数跟赋值运算符重载

新手求指导 关于两个函数不太理解 复制构造的是同一个内存地址吗 为什么要重载赋值运算符

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • NK_test 2016-04-19 15:42
    已采纳

    赋值运算符和复制构造函数都是用已存在的B对象来创建另一个对象A。不同之处在于:赋值运算符处理两个已有对象,即赋值前B应该是存在的;复制构造函数是生成一个全新的对象,即调用复制构造函数之前A不存在。
    CTemp a(b); //复制构造函数,C++风格的初始化
    CTemp a=b; //仍然是复制构造函数,不过这种风格只是为了与C兼容,与上面的效果一样
    在这之前a不存在,或者说还未构造好。
    CTemp a;
    a=b; //赋值运算符
    在这之前a已经通过默认构造函数构造完成。

    而之所以要自定义这些,是因为防止有指针时浅拷贝造成错误。具体可百度 rule of three原则

    点赞 打赏 评论
  • Robot-C 2016-04-19 14:52

    #include
    #include
    #include
    #include
    using namespace std;
    class My
    {
    public:
    My()
    {
    n = 0;
    arr = NULL;
    cout......
    答案就在这里:复制构造函数和重载赋值运算符
    ----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

    点赞 打赏 评论
  • blownewbee 2016-04-19 15:43

    因为默认的复制构造函数是浅拷贝。比如说如下类
    class Person
    {
    public:
    char * Name;
    int Age;
    };
    默认的构造函数在拷贝的时候,会创建一个新的对象,并且拷贝Name和Age的值,两个对象各自有一个Age,但是两个对象各自只有一个Name的指针,指向了同一个字符串对象。所以你需要自己实现拷贝构造函数,用malloc为第二个对象分配新的空间,用strcpy真正拷贝出一个新的Name来。

    点赞 打赏 评论

相关推荐 更多相似问题