在重载赋值运算符中调用构造函数?

时间:2013-04-04 13:20:28

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

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

实施例

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

这是我的构造函数param 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的类型不同

3 个答案:

答案 0 :(得分:1)

调用复制构造函数没有错 赋值运算符的实现(除非副本 构造函数本身是根据赋值实现的 课程)。事实上,这是一个常见的习惯用语:然后制作本地副本 将数据与当前实例交换。 (当然,这是 假设你有一个专门的交换。只是打电话 赋值运算符中对象本身的std::swap一个好主意。创建一个新实例,然后交换 对象的各个组成部分通常是。或者创造 自定义交换功能,交换组件和调用 它)。

答案 1 :(得分:1)

这不是实现赋值运算符的不合理方法,因为它允许您利用现有代码,并且只要您的复制赋值运算符具有强大的保证。

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

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

答案 2 :(得分:0)

相反更好。这很好。

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