构造函数的初始化列表,是严格的执行顺序么?

时间:2022-09-06 19:46:20
初始化列表当中的元素,是否是严格的按照他们在初始化列表当中出现的顺序,初始化的?
下面这个程序可以打印3,3,是我想要的结果。但是我还是想肯定一下,C++标准里面有没有这样规定?


struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
    int *pj;
    s2(int* p):m_s(p),pj(m_s.pi){
        printf("%d\n",pj[2]);
    }
};
int main(void)
{
    int ibuf[]={1,2,3};
    s2 obj(ibuf);
return 0;
}

8 个解决方案

#1


我记得是按照在类的声明里从上到下的顺序初始化,和构造函数里写的顺序无关。

#2


声明的顺序

#3


初始化顺序与在类中声明的顺序有关.

#4



struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
    int *pj;
    s2(int* p):m_s(p),pj(m_s.pi){
        printf("%d\n",pj[2]);
    }
};

这样写的话不是太清楚呢。C++中初始化列表是对于关键字class来说的呢。struct的初始化是C的标准。

#5


引用楼主  的回复:
初始化列表当中的元素,是否是严格的按照他们在初始化列表当中出现的顺序,初始化的?
下面这个程序可以打印3,3,是我想要的结果。但是我还是想肯定一下,C++标准里面有没有这样规定?
C/C++ code


struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
   ……


是严格按照变量在类中的声明顺序,而非初始化列表中出现的顺序。下面这篇文章,应该可以解楼主之惑:
初始化列表问题

#6


可以结贴了

#7


引用楼主  的回复:
初始化列表当中的元素,是否是严格的按照他们在初始化列表当中出现的顺序,初始化的?
下面这个程序可以打印3,3,是我想要的结果。但是我还是想肯定一下,C++标准里面有没有这样规定?
C/C++ code


struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
   ……


依赖成员变量声明次序,你这种初始化列表干脆别用,都用p就行了。

#8


C++里struct和class差别只有默认访问控制不同,其他完全一样
引用 4 楼  的回复:
C/C++ code

struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
    int *pj;
    s2(int* p):m_s(p),pj(m_s.pi){
        printf("%d\n",pj[2]);
    }
};


这样写的话不……

#1


我记得是按照在类的声明里从上到下的顺序初始化,和构造函数里写的顺序无关。

#2


声明的顺序

#3


初始化顺序与在类中声明的顺序有关.

#4



struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
    int *pj;
    s2(int* p):m_s(p),pj(m_s.pi){
        printf("%d\n",pj[2]);
    }
};

这样写的话不是太清楚呢。C++中初始化列表是对于关键字class来说的呢。struct的初始化是C的标准。

#5


引用楼主  的回复:
初始化列表当中的元素,是否是严格的按照他们在初始化列表当中出现的顺序,初始化的?
下面这个程序可以打印3,3,是我想要的结果。但是我还是想肯定一下,C++标准里面有没有这样规定?
C/C++ code


struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
   ……


是严格按照变量在类中的声明顺序,而非初始化列表中出现的顺序。下面这篇文章,应该可以解楼主之惑:
初始化列表问题

#6


可以结贴了

#7


引用楼主  的回复:
初始化列表当中的元素,是否是严格的按照他们在初始化列表当中出现的顺序,初始化的?
下面这个程序可以打印3,3,是我想要的结果。但是我还是想肯定一下,C++标准里面有没有这样规定?
C/C++ code


struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
   ……


依赖成员变量声明次序,你这种初始化列表干脆别用,都用p就行了。

#8


C++里struct和class差别只有默认访问控制不同,其他完全一样
引用 4 楼  的回复:
C/C++ code

struct s{
    int *pi;
    s(int* p):pi(p){printf("%d\n",pi[2]);}
};
struct s2{
    s m_s;
    int *pj;
    s2(int* p):m_s(p),pj(m_s.pi){
        printf("%d\n",pj[2]);
    }
};


这样写的话不……