在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。
2012-11-14 12:23
295 查看
关于最近看到的关于类的初始化的问题,我觉得有必要在这里讲一下,可能平时不注意的话,就有可能犯错。
看下面的代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
class X
{
int i;
int j;
public:
X(){};
X(int val)
: i(j),
j(val)
{cout<<"init is successful!\n";}
void put()
{
printf("i = %d, j=%d\n", i, j);
return ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
X a = X(5);
a.put();
return 0;
}
在这段代码中,变量i在变量之前声明,那么在类X的构造函数初始化成员列表中,变量i会先定义,变量j会后定义,也就是说变量i会先初始化,而变量j会后初始化,所以,在执行
X(int val)
: i(j),
j(val)时,i的值用j来初始话,其结果将是一个随机值,而j的值是5,下面是其结果:
在将变量i和j的声明顺序换一下后,其结果会发生变化,新的源代码是:
#include "stdafx.h"
#include<iostream>
using namespace std;
class X
{
int j;
int i;
public:
X(){};
X(int val)
: i(j),
j(val)
{cout<<"init is successful!\n";}
void put()
{
printf("i = %d, j=%d\n", i, j);
return ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
X a = X(5);
a.put();
return 0;
}
其编译后的结果是:
此时,就得到了所希望的确定的初始值,当然程序中的写法欠妥,好的写法应该是:
#include "stdafx.h"
#include<iostream>
using namespace std;
class X
{
int j;
int i;
public:
X(){};
X(int val)
: i(val),
j(val)
{cout<<"init is successful!\n";}
void put()
{
printf("i = %d, j=%d\n", i, j);
return ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
X a = X(5);
a.put();
return 0;
}
当然,最后的结果和上面是一样的,这也就告诉我们:按照与成员变量声明一致的次序来编写构造函数初始化列表是个好主意,此外,尽可能避免使用成员来初始化其他成员,一般情况下,通过(重复)使用构造函数的形参而不是使用对象的数据成员,可以避免由初始化的执行次序而引起的任何问题。
看下面的代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
class X
{
int i;
int j;
public:
X(){};
X(int val)
: i(j),
j(val)
{cout<<"init is successful!\n";}
void put()
{
printf("i = %d, j=%d\n", i, j);
return ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
X a = X(5);
a.put();
return 0;
}
在这段代码中,变量i在变量之前声明,那么在类X的构造函数初始化成员列表中,变量i会先定义,变量j会后定义,也就是说变量i会先初始化,而变量j会后初始化,所以,在执行
X(int val)
: i(j),
j(val)时,i的值用j来初始话,其结果将是一个随机值,而j的值是5,下面是其结果:
在将变量i和j的声明顺序换一下后,其结果会发生变化,新的源代码是:
#include "stdafx.h"
#include<iostream>
using namespace std;
class X
{
int j;
int i;
public:
X(){};
X(int val)
: i(j),
j(val)
{cout<<"init is successful!\n";}
void put()
{
printf("i = %d, j=%d\n", i, j);
return ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
X a = X(5);
a.put();
return 0;
}
其编译后的结果是:
此时,就得到了所希望的确定的初始值,当然程序中的写法欠妥,好的写法应该是:
#include "stdafx.h"
#include<iostream>
using namespace std;
class X
{
int j;
int i;
public:
X(){};
X(int val)
: i(val),
j(val)
{cout<<"init is successful!\n";}
void put()
{
printf("i = %d, j=%d\n", i, j);
return ;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
X a = X(5);
a.put();
return 0;
}
当然,最后的结果和上面是一样的,这也就告诉我们:按照与成员变量声明一致的次序来编写构造函数初始化列表是个好主意,此外,尽可能避免使用成员来初始化其他成员,一般情况下,通过(重复)使用构造函数的形参而不是使用对象的数据成员,可以避免由初始化的执行次序而引起的任何问题。
相关文章推荐
- 类的成员变量 声明顺序 决定 初始化顺序(构造函数初始化列表不影响)
- 初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的
- 在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 写程序说明C++中成员函数的初始化顺序只跟在类中的声明顺序有关, 而跟初始化列表中的顺序无关(笔试考过)
- 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- C++ - 类的成员变量 声明顺序 与 初始化顺序 相同
- 【警告:当在这里初始化时】初始化列表中成员变量初始化顺序问题
- 条款十三: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- C++ - 类的成员变量 声明顺序 与 初始化顺序 相同
- 类成员变量的初始化不是按照初始化表的顺序被初始化的,而是按照在类中声明的顺序被初始化的。
- 条款 13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- C++成员变量初始化列表执行顺序
- 构造函数初始化列表中成员列出顺序要和它们在类中声明顺序相同
- C++成员变量初始化列表和变量初始化顺序
- Effective c++ 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- 关于c++的类中成员变量初始化问题+初始化列表中对应顺序问题!
- C++成员变量的初始化顺序如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
- 初始化列表中成员列出的顺序和它们在类中声明的顺序相同