Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化C+中数据成员的正确顺序+;物体_C++ - Fatal编程技术网

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