C ++运算符重载奇怪的类型转换

时间:2014-01-14 05:07:43

标签: c++ xcode llvm

我有简单的c ++类向量,它有参数构造函数如下:

Vector::Vector(int size){
   ...
}

基于此实现,以下行有效:

Vector v(1);
Vector v2(94);

我的问题是我正在测试我的代码,而我发现这也是有效的:

Vector v = 1;

以某种方式调用参数构造函数。我也重载了operator =但是在这种情况下它从未被调用过。这是c ++中的正常行为吗?编译器如何将上面的赋值视为Vector v(1)?我在Xcode 5.0(LLVM编译器)

中这样做

3 个答案:

答案 0 :(得分:4)

它没有重载运算符=,它是复制初始化。如果你想阻止这种vector的构造,那么你可以使用explicit构造函数。

explicit Vector(int);

现在

Vector v = 1;

不正确。

答案 1 :(得分:0)

这是由于编译器支持的“自动类型转换”而导致的。这就是为什么它不使用复制构造函数。

布鲁斯·埃克尔在他的书“用C ++思考”中说:

  

默认构造函数,copy-constructor,operator =和析构函数可以由编译器自动合成。

答案 2 :(得分:-1)

以下,x2将在x2 = x1;

中调用复制构造函数
ClassX  x1() ;
ClassX  x2 =  x1 ;

以下,x4将在x4 = x3;

中调用复制赋值
ClassX  x3() ;
ClassX  x4() ;
x4 = x3 ;

如果ClassX有明确的复制构造,那么

ClassX x5(x1) ;  //this will compiled ok 
ClassX x5 = x1 ; //This will fail while compiled