鱼C论坛

 找回密码
 立即注册
查看: 3531|回复: 1

C++副本构造器赋值不会

[复制链接]
发表于 2013-4-5 06:32:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 乄ヤ灬风 于 2013-4-5 06:34 编辑

  1. #include <iostream>
  2. #include <string>

  3. class MyClass
  4. {
  5. public:
  6. MyClass(int *p);
  7. MyClass(const MyClass &rhs);
  8. ~MyClass();

  9. MyClass &operator=(const MyClass &rhs);
  10. void print();
  11. private:
  12. int *ptr;
  13. };

  14. MyClass::MyClass(int *p)
  15. {
  16. std::cout << "进入主构造器\n";
  17. ptr = p;
  18. std::cout << "离开主构造器\n";
  19. }

  20. MyClass::MyClass(const MyClass &rhs)
  21. {
  22. std::cout << "进入副本构造器\n";
  23. *this = rhs;
  24. std::cout << "离开副本构造器\n";
  25. }

  26. MyClass::~MyClass()
  27. {
  28. std::cout << "进入析构器\n";
  29. delete ptr;
  30. std::cout << "离开析构器\n";
  31. }

  32. MyClass &MyClass::operator=(const MyClass &rhs)
  33. {
  34. std::cout << "进入赋值语句重载\n";
  35. if( this != &rhs )
  36. {
  37. delete ptr;

  38. ptr = new int;
  39. *ptr = *rhs.ptr;
  40. }
  41. else
  42. {
  43. std::cout << "赋值号两边为同个对象,不做处理!\n"; // obj1 = obj1;
  44. }

  45. std::cout << "离开赋值语句重载\n";

  46. return *this;
  47. }

  48. void MyClass::print()
  49. {
  50. std::cout << *ptr << std::endl;
  51. }

  52. int main()
  53. {
  54. MyClass obj1(new int(1));
  55. MyClass obj2(new int(2));
  56. obj2 = obj1;
  57. obj1.print();
  58. obj2.print();

  59. std::cout << "-------------------------------\n";

  60. MyClass obj3(new int(3));
  61. MyClass obj4 = obj3;
  62. obj3.print();
  63. obj4.print();

  64. std::cout << "-------------------------------\n";

  65. MyClass obj5(new int(5));
  66. obj5 = obj5;
  67. obj5.print();

  68. return 0;
  69. }
复制代码



#include <iostream>
#include <string>
class MyClass
{
public:
    MyClass(int *p);
    MyClass(const MyClass &rhs);
    ~MyClass();
    MyClass &operator=(const MyClass &rhs);
    void print();
private:
    int *ptr;
};
MyClass::MyClass(int *p)
{
    std::cout << "进入主构造器\n";
    ptr = p;
    std::cout << "离开主构造器\n";
}
MyClass::MyClass(const MyClass &rhs)
{
    std::cout << "进入副本构造器\n";
    *this = rhs;
    std::cout << "离开副本构造器\n";
}
MyClass::~MyClass()
{
    std::cout << "进入析构器\n";
    delete ptr;
    std::cout << "离开析构器\n";
}
MyClass &MyClass :: operator=(const MyClass &rhs)
{
    std::cout << "进入赋值语句重载\n";
    if( this != &rhs )
    {
        delete ptr;
        ptr = new int;
        *ptr = *rhs.ptr;
    }
    else
    {
        std::cout << "赋值号两边为同个对象,不做处理!\n"; // obj1 = obj1;
    }
    std::cout << "离开赋值语句重载\n";
    return *this;
}
void MyClass::print()
{
    std::cout << *ptr << std::endl;
}
int main()
{
    MyClass obj1(new int(1));
    MyClass obj2(new int(2));
    obj2 = obj1;
    obj1.print();
    obj2.print();
    std::cout << "-------------------------------\n";
    MyClass obj3(new int(3));
    MyClass obj4 = obj3;
    obj3.print();
    obj4.print();
    std::cout << "-------------------------------\n";
    MyClass obj5(new int(5));
    obj5 = obj5;
    obj5.print();
    return 0;
}

这句什么意思const MyClass &rhs                 如何赋值语句重载MyClass &MyClass :: operator=(const MyClass &rhs)   this 与 *this有区别吗?  这句也不懂*ptr = *rhs.ptr;

MyClass::MyClass(int *p)
{
    std::cout << "进入主构造器\n";
    ptr = p;
    std::cout << "离开主构造器\n";
}
MyClass::MyClass(const MyClass &rhs)
{
    std::cout << "进入副本构造器\n";
    *this = rhs;
    std::cout << "离开副本构造器\n";
}

    MyClass obj1(new int(1));
    MyClass obj2(new int(2));
    obj2 = obj1;
    obj1.print();
    obj2.print();
    std::cout << "-------------------------------\n";
    MyClass obj3(new int(3));
    MyClass obj4 = obj3;
    obj3.print();
    obj4.print();
    std::cout << "-------------------------------\n";
obj2 = obj1;
myClass obj4 = obj3;       赋值对象,打印的主构造器与副本构造器不一样。是什么判断出来的?

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-6 12:21:20 | 显示全部楼层
我只是路过打酱油的。我真的很感悟……
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-4 13:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表