【问题标题】:Calling constructor within overloaded assignment operator?在重载赋值运算符中调用构造函数?
【发布时间】:2013-03-26 14:26:40
【问题描述】:

基本上,在其重载赋值运算符中调用类的构造函数是否可接受的编程实践/风格?如果没有,为什么不呢?

示例:

所以我有一个有 3 个数据成员的类,一个名为“value”的动态 int 数组,它包含一个大数字的数字,一个 int length,它指示数字中的位数,以及一个 int maxLength,它表示数字的最大长度(动态数组的大小)

这是我的带参数 int 的构造函数:

bigInt::bigInt(const int &rhs){
    //turn num_ into a string 'num'
    stringstream ss;
    ss << num_;
    string num = ss.str();
    length = strlen(num.c_str());
    maxLength = (length - (length%16)) + 16;
    value = new int[maxLength];
    for(int i=1; i<=length; i++){
        value[i-1] = num.at(length-i) - '0';
    }
}

这是我的重载赋值运算符,其中右侧是常规 int 此方法调用构造函数:

bigInt bigInt::operator=(const int &rhs){
    *this = bigInt(rhs);
    return *this;
}

编辑:我想我应该用不同的措辞。我的意思不是 COPY 构造函数,而是具有非类实例参数的常规构造函数,以及 rhs 与 lys 类型不同的重载赋值运算符

【问题讨论】:

  • 你会怎么做以及它会有什么帮助?
  • 举个例子会很有用。
  • 您的示例将导致无限递归。 *this = bigInt(rhs);
  • @AaronMampáro - 试试吧 :)
  • @AaronMampáro 另请注意,从赋值运算符返回按值是一个错误,会降低性能。

标签: c++ operator-overloading copy-constructor


【解决方案1】:

在 赋值运算符的实现(除非副本 构造函数本身是根据赋值来实现的, 课程)。其实这是一个常见的成语:make a local copy, then 与当前实例交换数据。 (这当然, 假设您有专门的交换。只是打电话 赋值运算符中对象本身的std::swap不是一个好主意。创建一个新实例,然后交换 对象的各个组成部分通常是。或者创造 交换组件的自定义交换函数,并调用 它。)

【讨论】:

    【解决方案2】:

    这不是一种不合理的方式来实现你的赋值运算符,因为它允许你利用现有的代码,并且只要你的复制赋值运算符可以提供强有力的保证。

    但是需要注意两点:首先,确保您的复制构造函数、复制赋值运算符和析构函数都正确实现,否则您将开始遇到内存管理问题。其次,C++ 语言已经提供了一个包含元素、长度和最大长度的类:它称为std::vector,如果您更改代码以使用它,则无需编写复制构造函数、复制赋值运算符,和析构函数,因为它们会正常运行!

    另外,你的赋值运算符应该通过引用返回(或者如果你真的不想链接,void)。当链式赋值不能按预期工作时,按值返回总有一天会导致错误。

    【讨论】:

      【解决方案3】:

      相反的更好。完全没问题。

      但是,不要忘记,在复制构造器中,您必须重做您在构造器中所做的事情;即,初始化你在你的类中的任何变量,这在重载的赋值运算符函数中是不必要的。

      【讨论】:

      • 如果我理解正确,提问者是在询问他是否可以从赋值运算符函数中调用复制构造函数。我看不出有什么问题,但是我做相反的事情,因为复制构造函数更通用并且需要初始化东西。就像你复制一个数组容器一样。在您继续使用新对象中的其他功能之前,您必须对其进行初始化。
      • 不知何故,我无法想象如何调用operator= 中的复制构造函数,也无法调用标准构造函数。但我可能太累了,我可能会错过一些东西。相反的部分还可以——在复制构造函数中调用operator=,但我不明白你对初始化和其他东西的看法。无论如何。
      • “不知何故,我无法想象您如何在 operator= 中调用复制构造函数” - 为什么不呢,这是一个常见的习惯用法(即使您不这样做)通常不会自己调用它,尤其是考虑到 C++11)。 “相反的部分可以 - 在复制构造函数中调用 operator= - 不,不要那样做,那是垃圾。除此之外,我也完全不明白这个答案在说什么。但没关系,无论如何,问题已经发生了重大变化。
      猜你喜欢
      • 2014-10-12
      • 2017-10-06
      • 2011-02-08
      • 2011-05-21
      • 2011-02-20
      • 2013-07-03
      • 2013-10-23
      • 2015-10-14
      • 1970-01-01
      相关资源
      最近更新 更多