C++ 为类变量赋值

C++ 为类变量赋值,c++,C++,以下是一些代码: class A{ private : int a, b; public : A(int x):a(x),b(a*a){} int getA(){ return a; } int getB(){ return b; } }; int main(){ A a=13; printf("%d %d\n", a.getA(), a.getB() ); r

以下是一些代码:

class A{
    private :
        int a, b;
    public :
        A(int x):a(x),b(a*a){}
    int getA(){
        return a;
    }
    int getB(){
       return b;
    }
};

int main(){
    A a=13;
    printf("%d %d\n", a.getA(), a.getB() );
    return 0;
}
A=13
,我不明白它是如何调用构造函数的,为什么?
我认为cast没有任何定义,也不会被编译,但它运行良好,并调用了构造函数。

这称为隐式声明。当你写
A时,A=13A(13)因为声明了一个以int为参数的构造函数。如果您不希望发生这种情况,请在构造函数之前放置一个
explicit
关键字,然后您将得到编译器错误,除非您编写
A(13)而不是
A=13

可以将接受单个参数的非显式构造函数用作转换构造函数,以隐式地将参数类型转换为类类型

因此,构造函数用于将
13
转换为
A
类型

如果需要,可以通过使构造函数显式来防止隐式转换:

explicit A(int x):a(x),b(a*a){}
仍然可以用于显式转换的:

A a1(13);     // OK: explicit conversion
A a2 = A(13); // OK: explicit conversion
A a3 = 13;    // Error: implicit conversion not allowed via explicit constructor

您似乎不知道转换构造函数。转换构造函数是只接受一个参数并构造该类对象的构造函数。它的工作原理类似于从某种类型到类的转换,因此命名为转换构造函数

隐式转换,我认为这是让您感到困惑的地方,当编译器看到两种不同的类型并试图通过寻找可能的转换使它们兼容时,就会发生这种情况

正如您所看到的,隐式转换会导致相当多的混淆(int也可以是a?!)。因此,您应该小心类中的转换构造函数,必要时使用
explicit
关键字

显式A(inti);
当您将转换构造函数指定为
显式
时,这会告诉编译器不要对该类型执行任何隐式转换。当这种情况发生时,您只能通过使用类型转换,例如
static\u cast(a)


感谢阅读。

如果不需要隐式转换,请将构造函数定义为
explicit