C ++中的赋值与初始化

时间:2010-02-20 18:02:37

标签: c++ class initialization operator-overloading

我认为构造函数控制C ++中的初始化和operator = functions控制赋值。那么为什么这段代码有用呢?

#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;
}

在main函数的第三行,我将int分配给类Deg的对象。由于我没有operator=(int)函数,我认为这肯定会失败......但是它会调用Deg(int a)构造函数。那么构造函数也可以控制赋值吗?

2 个答案:

答案 0 :(得分:18)

这就是所谓的隐式类型转换。编译器将查看是否有一个构造函数可以直接从您分配的类型更改为您尝试分配的类型,并调用它。您可以通过在您不希望隐式调用的构造函数前面添加explicit关键字来阻止它发生,如下所示:

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

答案 1 :(得分:4)

只是为了澄清JonM的回答:

对于行d = 3,涉及分配运算符 。正如JonM所说,3被隐式转换为Deg,然后使用编译器生成的赋值将Deg 分配d运算符(默认情况下执行成员分配)。如果要阻止赋值,则必须声明私有赋值运算符(并且不实现它):

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