hugfish 发表于 2012-12-13 17:04:14

c++入门的副本构造器问题

本帖最后由 hugfish 于 2012-12-13 17:28 编辑

#include <iostream>

class Person{
public :
      Person(int *p);
      Person(const Person &person);
      Person& operator=(const Person &rhs);
      ~Person();
      void print();
private :
      int *p;
};


Person::Person(int *p1){
      std::cout << "进入构造器" << std::endl;
      p = p1;
      std::cout << "退出构造器" << std::endl;
}

Person::Person(const Person &rhs){
      std::cout << "进入副本构造器" << std::endl;
      *this = rhs;
      std::cout << "退出副本构造器" << std::endl;
}

Person::~Person(){
      delete p;
}

Person& Person::operator=(const Person &rhs){
      std::cout << "进入重载操作符=函数" << std::endl;
      if(this != &rhs){
                delete p;//这句重要 因为在给对象初始化时候 很有可能给p赋予了一个地址。如果没有delete 在下面重新给p赋值,则会丢失之前的地址 造成内存泄漏
                p = new int; //重新给p分配内存?
                *p = *rhs.p;
      }else{
                std::cout << "同一个变量 不做处理 " << std::endl;
      }
      std::cout << " 退出 重载操作符=函数" << std::endl;
      return *this;
}

void Person :: print(){
      std::cout << *p << std::endl;
}

int main(){

      Person p1(new int(1));
      Person p2(new int(2));

      p2 = p1;

      p1.print();
      p2.print();

      std::cout << "------------------------------" << std::endl;
      //Person p3; //报错 没有空参数的构造函数
      Person p3(new int(3));
      Person p4 = p3; //报错 断点 p4中的p指针变量不可用 为什么 我是vc++ 6.0下运行

      p3.print();
//      p4.print();



      return 0;
}

hugfish 发表于 2012-12-13 17:29:20

没人遇到这个问题吗

小小小菜菜菜 发表于 2018-12-20 19:40:54

帮你顶下帖子,我也不会这个

胡同学 发表于 2019-2-28 16:22:37

hugfish 发表于 2012-12-13 17:29
没人遇到这个问题吗

我用code block不会报错

Julia999 发表于 2019-3-5 09:17:38

应该是版本问题
页: [1]
查看完整版本: c++入门的副本构造器问题