2010-02-20 52 views
7

我认为构造函数在C++中控制初始化和operator = functions控制赋值。那么为什么这个代码工作?C++中的赋值vs初始化

#include <iostream> 
#include <cmath> 
using namespace std; 

class Deg { 
    public: 
     Deg() {} 
     Deg(int a) : d(a) {}   
     void operator()(double a) 
     { 
      cout << pow(a,d) << endl; 
     } 

    private: 
     int d; 
}; 

int 
main(int argc, char **argv) 
{ 
    Deg d = 2; 
    d(5); 
    d = 3; /* this shouldn't work, Deg doesn't have an operator= that takes an int */ 
    d(5); 
    return 0; 
} 

在主功能的第三行,我分配一个intDeg类的对象。由于我没有operator=(int)函数,我认为这肯定会失败......但相反,它调用Deg(int a)构造函数。那么构造函数也控制分配?

回答

18

这就是所谓的隐式类型转换。编译器会查看是否有构造函数直接从您指定的类型更改为您要分配的类型,然后调用它。您可以通过在构造函数前添加的explicit关键字阻止它发生,你不希望被隐式调用,像这样:

explicit Deg(int a) : d(a) {}

+0

+1明确 – dimba 2010-02-20 18:10:29

+3

至少有一家公司我已经在发生了规则制定“使用显式所有的构造函数,除非有充分的理由不在它的编码标准中。这有助于避免可能出现的令人费解的情况。 – Sean 2010-02-20 18:16:26

+0

我想你的意思是在所有可以用一个参数调用的构造函数:)? – 2010-02-21 12:30:36

4

只是为了澄清JonM的回答是:

对于行d = 3,转让运营商涉及。正如JonM所说,3被隐含地转换为Deg,然后Deg转换为d使用编译器生成的赋值运算符(默认情况下是成员方赋值)。如果你想防止分配,则必须申报的私人赋值运算符(不执行的话):

//... 
private: 
    Deg& operator=(const Deg&); 
}