在C++中给类对象赋值

5

很抱歉如果这是重复的问题,但我没有找到对这个问题的讨论。所以,我正在学习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


2
明确定义一个赋值成员函数。 - seccpur
3个回答

7

应该将单参数构造函数标记为explicit,因为在C++中定义单参数构造函数也会创建从参数类型到构造类型的隐式转换,这通常是不希望发生的。

tt1 = -3;

因此,它等于:
tt1 = T(-3);

即它使用复制/移动赋值。在第二种情况下,(-3, 6.)只是语句-3, 6.周围的括号,其中,是序列运算符。因此该语句计算结果为6.,并选择使用double构造函数的隐式转换。

2
当你写tt1 = -3时,这等同于
T temp(-3);
tt1 = temp;

在C++中,一个只有一个参数的构造函数可以作为隐式转换运算符。因此,编译器会查看tt1 = -3并发现它可以使用你的构造函数将-3转换为T类型,并在一个临时变量中使用默认的=运算符将值赋给tt1。对于tt1 = 6.的赋值也是类似的,只不过使用了一个只接受double类型参数的构造函数。如果在构造函数前加上explicit关键字,则不能像这样进行隐式转换。
当你输入tt1 = (-3, 6.)时,你正在调用逗号运算符。在C/C++中,(x,y)的计算结果为y,因此这实际上等价于tt1 = 6.

-4

提供set_aInt是很好的,这样你就可以跟踪值在类中传递到哪里,而将tt1 = -3;传递给类T时等同于传递(-3,6)。可能重写已接受整数值,但它擦除了它并传递了双精度值6,因此你遇到了问题。当你单独初始化两个实例时,会发生两次分配值的分配,但在单个初始化中,覆盖先前值的更新值进入类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接