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