2016-09-30 46 views
5

如果它是重复的问题,我很抱歉,但是我没有找到关于这个问题的讨论。所以,我正在学习C++,并且我不明白将值分配给类对象的以下问题。我有这个实现的类牛逼的:将值分配给C++中的类对象

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等于而不是-3

+2

显式定义赋值成员函数。 – seccpur

回答

7

您应该标记单参数构造函数explicit,因为定义一个参数构造函数还会创建从参数类型到C++中的构造类型的隐式转换,这通常是不期望的。

tt1 = -3; 

因此等于:

tt1 = T(-3); 

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

-4

提供set_aInt是很好的,这样您就可以跟踪值传递到类中的位置,因为它等于通过tt1 = -3;而(-3,6)被传递给T类,可能是覆盖被接受的整数值,但它会擦除它并传递双值6.因此你面临一个问题。当你单独初始化分配的两个实例发生和分配值,但在单个初始化更新后的值将覆盖前值进入类

2

当你写tt1 = -3这相当于

T temp(-3); 
tt1 = temp; 

在C++ ,采用单个参数的构造函数充当隐式转换运算符。因此,编译器查看tt1 = -3,并发现它可以使用临时变量中的构造函数将-3转换为T类型,然后使用默认的=运算符将值分配给tt16.的赋值工作方式类似,只是使用了一个使用单个double的构造函数。如果您预先使用explicit构造函数,则不会将其用于此类转换。

当您键入tt1 = (-3, 6.)时,您正在调用逗号运算符。在C/C++中,(x,y)的计算结果为y,所以这实际上相当于tt1 = 6.

相关问题