C++中的赋值与初始化

Vla*_*ala 7 c++ initialization class 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*onM 18

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

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

  • 我工作过的至少一家公司的规则是"在所有构造函数中使用显式,除非有充分的理由不在其编码标准中".这有助于避免像这样的潜在令人费解的情况. (3认同)