C++ 将值传递给构造函数c++;

C++ 将值传递给构造函数c++;,c++,class,oop,constructor,C++,Class,Oop,Constructor,在这里,我使用两种语法将值传递给构造函数:- class A { public: int x,y; A(int a,int b) : x(a),y(b){} void show() { cout<<x<<" "<<y<<endl; } }; int main() { A obj1={5,6};//first method A obj2(9,10);//second

在这里,我使用两种语法将值传递给构造函数:-

class A   
{

public:
    int x,y;

    A(int a,int b) : x(a),y(b){}
    void show()
    {
        cout<<x<<" "<<y<<endl;
    }
};

int main()
{

    A obj1={5,6};//first method
    A obj2(9,10);//second method

    obj1.show();
    obj2.show();
}
A类
{
公众:
int x,y;
A(inta,intb):x(A),y(b){}
无效显示()
{
库特
这是对对象使用列表初始化,即使没有定义2参数构造函数,它也是完全有效的


这可能有助于您理解:

当您删除此构造函数时,
类A
可以进行聚合初始化,这是由以下大括号语法引起的:
A obj1={5,6};
(自C++11以来,它也具有此等效形式:
A obj1{5,6};

如您所能,这适用于您的情况,因为
A类
不具备以下任何一项:

  • 私有或受保护的非静态数据成员(在C++11之前适用)
  • 用户声明的构造函数(从C++11一直应用到C++17)
  • 用户提供的构造函数(允许显式默认或删除的构造函数)(从C++17到C++20适用)
  • 用户提供、继承或显式构造函数(允许显式默认或删除的构造函数)(自C++20起应用)
  • 用户声明或继承的构造函数
  • 虚拟基类、私有基类或受保护基类(从C++17开始应用)
  • 虚拟成员函数
  • 默认成员初始值设定项(从C++11到C++14适用)

  • 相反,这种语法:
    A obj2(9,10);
    正在执行,并且一旦删除构造函数,它将无法编译,原因是:

    […]如果初始化是直接初始化[…] 将考虑构造函数。[…]如果没有构造函数应用[…],则初始化将被忽略 格式不正确。


    在删除构造函数之前,在执行时,相同的语法
    A obj1={5,6};
    正在调用它


    什么是聚合初始化?它是一个实例的初始化(数组或依附于上述列表的结构/类)括号内的参数必须与声明中的结构/类非静态数据成员匹配。在C++ C++的后期版本中,它被大量添加到语言中,因为它的语法形式被添加到语言中。

    使用括号形式的初始化和括号初始化的一般利弊是许多人讨论的。在Scott Meyers的有效C++中的第7项是一个获得全面读出的好地方。这句话的第一个优点是:

    好的调用3DAVE,只是在我看到你的评论时,才更新以澄清:好链接——我不知道支撑初始化是有用的。列表初始化使用某种内部构造函数调用。机制是什么?它只是用来使C++的结构像C结构那样运行吗?
    A obj1={5,6};