c ++构造函数问题

时间:2011-07-21 18:26:36

标签: c++ constructor

我仍然对CTOR感到困惑:

问题1:
为什么第15行拨打A:A(int)而不是A:A(double&)

问题2:
为什么第18行没有拨打A:A(B&)

#include <iostream>
using namespace std;

class B{};

class A{
public:
   A(int )    {cout<<"A::A(int)"<<endl;}
   A(double&){cout<<"A::A(double&)"<<endl;} // it will work if it is A(double), without the &
   A(B&){cout<<"A::A(B&)"<<endl;}
};

int main()
{
/*line 15*/   A obj((double)2.1);  // this will call A(int), why?
   B obj2;
   A obj3(obj2);
/*line 18*/   A obj4(B);          // this did not trigger any output why?
}

4 个答案:

答案 0 :(得分:6)

第15行: A(double&)只能使用左值,即可以分配的变量。 (double)2.1是一个右值。如果您还需要接受rvalues作为参考,请使用A(const double&)

第18行: B是一种类型,而不是一种值。 A obj4(B);仅声明名为obj4的函数,其中B并返回A

答案 1 :(得分:3)

第15行

您的引用构造函数仅接受对非const对象的引用。

也就是说,你写道:

A(int)     { cout<<"A::A(int)"<<endl; }
A(double&) { cout<<"A::A(double&)"<<endl; }
A(B&)      { cout<<"A::A(B&)"<<endl; }

而不是:

A(int)           { cout<<"A::A(int)"<<endl; }
A(double const&) { cout<<"A::A(double const&)"<<endl; }
A(B const&)      { cout<<"A::A(B const&)"<<endl; }

这个问题在于,在A obj((double)2.1)中,您使用临时对象调用了构造函数(在本例中,是双文字2.1(强制转换为{{ 1}}没有意义),临时对象可能无法绑定到不引用double的引用。

因此无法调用const构造函数;唯一可能匹配的是A(double&),并且对您的数据(A(int)2.1)执行所需的转换以实现此目的。 (你的编译器will normally warn you发生这种情况。)

因此,请使用接受2的引用的构造函数形式。


第18行

至于您的constA obj4(B)是一种类型,因此您声明了一个名为B的函数,该函数接受(未命名)obj4并返回{{1 }}

答案 2 :(得分:0)

因为&表示它是引用类型,而在第15行,您传递的是值,而不是引用。

答案 3 :(得分:-1)

第15行,double是一个rvalue(临时),不能转换为非const引用。对于第18行,最可能的解释是您的编译器只是优化了构造函数调用。