在C ++

时间:2016-09-30 12:04:11

标签: c++

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

3 个答案:

答案 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.由于你遇到了问题。在单独初始化时,会发生两个分配实例并分配值,但在单个初始化中,覆盖先前值的更新值将进入类