如果是重复的问题,我很抱歉,但我没有找到关于这个问题的讨论。所以,我正在学习C ++,并且我不理解为类对象赋值的以下问题。我有类 T :
的实现class T
{
int aInt;
double aDouble;
public:
T():aInt(0),aDouble(0.){}
T(int my_aInt, double my_aDouble):aInt(my_aInt), aDouble(my_aDouble){}
T(int my_aInt):aInt(my_aInt), aDouble(0.){}
T(double my_aDouble):aInt(0), aDouble(my_aDouble){}
void set_aInt(int my_aInt){
aInt = my_aInt;
}
void set_aDouble(double my_aDouble){
aDouble = my_aDouble;
}
int get_aInt(){
return aInt;
}
double get_aDouble(){
return aDouble;
}
};
我想创建这个类的对象并为它们分配一些值。我可以这样做:
T tt1(-1, 5.), tt2(-1), tt3(5.);
它工作正常。现在我想更改分配给对象 tt1 的值。我知道我可以这样做:
tt1.set_aInt(-3); // gives aInt = -3, aDouble = 0
tt1.set_aDouble(6.); // gives aInt = 0, aDouble = 6.
它也可以正常工作。但似乎还有另一种方法可以做到:
tt1 = -3; // gives aInt = -3, aDouble = 0
tt1 = 6.; // gives aInt = 0, aDouble = 6.
tt1 = (-3, 6.); // gives aInt = 0, aDouble = 6. - Why?
我的第一个问题是:tt1 = -3;
是否等同于tt1.set_aInt(-3);
,这是一个好习惯吗?第二个问题是tt1 = (-3, 6.);
出了什么问题?为什么它设置 aInt 的值等于 0 而不是 -3 ?< / p>
答案 0 :(得分:7)
您应该标记单个参数构造函数explicit
,因为定义单个参数构造函数还会创建从参数类型到C ++中构造类型的隐式转换,这通常是不希望的。
tt1 = -3;
因此等于:
tt1 = T(-3);
即。它使用复制/移动分配。在第二种情况下,(-3, 6.)
只是语句-3, 6.
周围的括号,其中,
是序列运算符。因此,语句的计算结果为6.
,并选择使用double
构造函数的隐式转换。
答案 1 :(得分:2)
当你写tt1 = -3
时,这相当于
T temp(-3);
tt1 = temp;
在C ++中,采用单个参数的构造函数充当隐式转换运算符。因此编译器查看tt1 = -3
并看到它可以使用临时变量中的构造函数将-3转换为T
类型,然后使用默认的=
运算符将值赋给{ {1}}。对tt1
的赋值的工作方式类似,只是使用了使用单个double的构造函数。如果您使用6.
前置构造函数,则不会将其用于此类转换。
当您键入explicit
时,您正在调用逗号运算符。在C / C ++中,tt1 = (-3, 6.)
的计算结果为(x,y)
,因此这实际上等同于y
答案 2 :(得分:-4)
最好提供set_aInt,以便您可以跟踪值传递到类中的位置,因为它等于传递tt1 = -3; while(-3,6)传递给T类可能是覆盖接受整数值但是它擦除了它并传递了双值6.由于你遇到了问题。在单独初始化时,会发生两个分配实例并分配值,但在单个初始化中,覆盖先前值的更新值将进入类