C++ 初始化C+中数据成员的正确顺序+;物体
当我使用这段代码时,输出会根据类中指针的声明顺序进行更改C++ 初始化C+中数据成员的正确顺序+;物体,c++,C++,当我使用这段代码时,输出会根据类中指针的声明顺序进行更改 #include<iostream> using namespace std; class myClass{ int *y,*z,*x; public: myClass(int a,int b,int c): x(seta(a)),y(setb(b)),z(setc(c)){} int* seta(int a){ cout<<a;
#include<iostream>
using namespace std;
class myClass{
int *y,*z,*x;
public:
myClass(int a,int b,int c): x(seta(a)),y(setb(b)),z(setc(c)){}
int* seta(int a){
cout<<a;
return (new int(a));
}
int* setb(int b){
cout<<b;
return (new int(b));
}
int* setc(int c){
cout<<c;
return (new int(c));
}
};
int main(){
myClass m1(1,2,3);
return 0;
}
然后,不管指针的声明顺序如何,输出都是123。为什么?阅读
列表中成员初始值设定项的顺序不相关:实际的初始化顺序如下:
当您在构造函数中作为调用执行时,顺序将与执行调用的顺序相同。如果您颠倒调用顺序,那么顺序也会颠倒。在构造函数的初始值设定项列表中,变量将按照成员声明的顺序分配。如果您编写的初始值设定项列表不符合初始化的顺序,则应该从编译器中得到警告 您的代码示例使用gcc生成以下警告:
main.cpp: In constructor 'myClass::myClass(int, int, int)':
main.cpp:267:16: warning: 'myClass::x' will be initialized after [-Wreorder]
267 | int *y,*z,*x;
| ^
main.cpp:267:10: warning: 'int* myClass::y' [-Wreorder]
267 | int *y,*z,*x;
| ^
main.cpp:269:9: warning: when initialized here [-Wreorder]
269 | myClass(int a,int b,int c): x(seta(a)),y(setb(b)),z(setc(c)){}
| ^~~~~~~
如果按照第二个代码示例中给出的方式编写构造函数,变量仍将按照定义的顺序初始化,但初始化首先使用空指针,发生这种情况后,它将使用构造函数体中给出的新值覆盖已初始化的值
编译器将优化未使用的默认初始化,因为它没有副作用,但您必须了解,在构造函数体中分配变量不是变量初始化,而是分配 因为类/结构的成员总是按照声明的顺序初始化的 在第一个示例中,声明的顺序是
y,z,x
,因此初始化列表中的执行顺序是
y(setb(b))
z(setc(c))
x(seta(a))
在初始化列表中给出的顺序并不重要(但是,正如Klaus所指出的,如果顺序不同,编译器可能会发出警告)
所以你应该得到2 3 1
在第二个示例中,y,z,x
是默认初始化的(使用未定义的值),然后按照指令的顺序执行构造函数体进行修改
x=seta(a);
y=setb(b);
z=setc(c);
所以你得到了
1 2 3
,但这仅仅是因为y,z,x
在没有使用seta()
setb()
和setc()
可能的重复项:,非常感谢你
x=seta(a);
y=setb(b);
z=setc(c);