基本上,在重载的赋值运算符中调用类的构造函数是否可以接受编程实践/样式?如果没有,为什么不呢?
实施例
所以我有一个有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的类型不同
答案 0 :(得分:1)
调用复制构造函数没有错
赋值运算符的实现(除非副本
构造函数本身是根据赋值实现的
课程)。事实上,这是一个常见的习惯用语:然后制作本地副本
将数据与当前实例交换。 (当然,这是
假设你有一个专门的交换。只是打电话
赋值运算符中对象本身的std::swap
是
不一个好主意。创建一个新实例,然后交换
对象的各个组成部分通常是。或者创造
自定义交换功能,交换组件和调用
它)。
答案 1 :(得分:1)
这不是实现赋值运算符的不合理方法,因为它允许您利用现有代码,并且只要您的复制赋值运算符具有强大的保证。
但有两点需要注意:首先,确保您的复制构造函数,复制赋值运算符和析构函数都已正确实现,否则您将开始遇到内存管理问题。其次,C ++语言ALREADY提供了一个具有元素,长度和最大长度的类:它被称为std::vector
,如果您更改代码以使用它,则不需要编写复制构造函数,复制赋值运算符和析构函数,因为它们只是表现正常!
此外,您的赋值运算符应该通过引用返回(或者如果您确实不想链接,void
)。当链式赋值不能按预期工作时,按值返回有一天会导致错误。
答案 2 :(得分:0)
相反更好。这很好。
但是,不要忘记在复制构造函数中,你必须重做你在构造函数中所做的事情;即,初始化您的类中的任何变量,这不必在重载的赋值运算符函数中完成。