类成员初始化的问题

solookin 2010-05-11 08:07:04
示例:

#include <iostream>
#include <string>

class A{
public:
A();
public:
int m;
char ch;
std::string str;
double db;
float ft;
bool b;
};
A::A(){
std::cout<<m<<std::endl;
std::cout<<ch<<std::endl;
std::cout<<str<<std::endl;
std::cout<<db<<std::endl;
std::cout<<ft<<std::endl;
std::cout<<b<<std::endl;
}
int main(){
A a;
A *b=new A;
return 0;
}



请问一下,a和b的成员变量的初始值为什么不一样?

根据这里http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index2.html的文章的内容,

引用
当有些成员变量或父类对象没有在初始化列表中出现时,它们仍然在初始化操作这一步骤中被初始化


这句话是不是有错误?

还是: 类成员的初始化只是构建这个成员,把它初始化为一个随机的值?

那么a和b的初始化过程有什么区别?

求解答。
...全文
184 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
solookin 2010-05-11
  • 打赏
  • 举报
回复
行,就这样,结贴。
耍宝王 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 solookin 的回复:]

那这倒是编译器的不同了?我用gcc4.x编译输出b的结果和你的dmc输出的是一样的。
[/Quote]
这结果兴许还和编译器的优化或其它选项有关呢(早些时候,我用Intel C++ 编译器还发现,类似的情况Debug结果是未定义,Release却全部初始为 0),反正就结果而言,对内置类型做初始化还是必要的
selooloo 2010-05-11
  • 打赏
  • 举报
回复
当有些成员变量或父类对象没有在初始化列表中出现时,它们仍然在初始化操作这一步骤中被初始化
这句话没错。比如类有个string成员,string成员不在初始化列表中出现,也会初始化,对内置类型,没有初始化列表中出现,那它的值是为初始化的,即随机值

a和b的初始化过程有什么区别?
没区别,只是创建的方式不同
solookin 2010-05-11
  • 打赏
  • 举报
回复
那这倒是编译器的不同了?我用gcc4.x编译输出b的结果和你的dmc输出的是一样的。
耍宝王 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 solookin 的回复:]

那为什么b的成员变量的值都为0?
[/Quote]
我用了三种编译器对你的代码各做了几次测试,结果如下:
g++ 4.4.3 :a、b成员变量除str为空字符外,其它未定义(随机)
g++输出:
2293560


6.7297e+268
7.80085e+033
16
-------------a和b的分界线
4064568
8

1.70169e+214
128.451
79

VC2008 :a全部为未定义(随机结果),b部分为未定义(随机结果)
VC2008输出:
1245004


1.80097e-307
5.89475e-039
36
-------------a和b的分界线
3736896
@

0
0
0

dmc 8.52 :a全部为未定义(随机结果),b成员类类型默认初始化,其它以0初始化
dmc输出:
4350552
?

3.39542e-313
6.43067e-39
8
-------------a和b的分界线
0


0
0
0

结论和我8楼说的一样
ly861014 2010-05-11
  • 打赏
  • 举报
回复
对于A *b=new A;是不管作用域的,在全局、局部作用域都是一样的初始化方式,都是按照函数内成员的初始化方式来初始化,m, ch, db, ft都没有初始化,string类对象初始化为空,所谓的“初始化为随机值”这句话不可取。
对于A a;是要看它定义在什么地方,全局作用域时,其成员均有初始化,内置的为0,string类的还是为空;如果在局部作用域,则内置类型不初始化,string类对象为空。
不过得注意布尔值的初始化,我试了一下,全局默认初始化为0,局部为1。

solookin 2010-05-11
  • 打赏
  • 举报
回复
那为什么b的成员变量的值都为0?
wb_rock 2010-05-11
  • 打赏
  • 举报
回复
都是随机的,最好初始化
耍宝王 2010-05-11
  • 打赏
  • 举报
回复
“在构造函数初始化列表中没有显式提及的每个成员,使用与初始化变量相同的规则来进行初始化。运行该类型的默认构造函数,来初始化类类型的数据成员。内置或复合类型的成员的初始值依赖于对象的作用域:在局部作用域中这些成员不被初始化,而在全局作用域中它们被初始化为 0。”——C++ Primer中文第四版

A a;和A *b=new A;都在局部作用域中,应此,其中内置类型(int、char、double、float、bool)成员不初始化,其内容未定义(同时,还依赖于编译器,有些编译会统一初始化为 0,有些则不会)
jefferyyangkai 2010-05-11
  • 打赏
  • 举报
回复
这句话应该没错吧
ab的区别在于他们一个存在堆中,一个存在栈里,初始化的时候随机值不一样(后半句是我的理解)
wade_2003 2010-05-11
  • 打赏
  • 举报
回复
对于初始化过程,我觉得是一样的吧

#include <iostream>
#include <string>

class A{
public:
A();

public:
int m;
char ch;
std::string str;
double db;
float ft;
bool b;
};
A::A(){
std::cout<<"A的对象已构造!"<<std::endl;

}
int main(){
A a;
A *b=new A;

delete b;
return 0;
}
solookin 2010-05-11
  • 打赏
  • 举报
回复
错!b的成员变量的值都是0值!


m=0;
ch='\0';
str=NULL;
db=0;
ft=0;
b=0;


不信你试试

GingerJWS 2010-05-11
  • 打赏
  • 举报
回复
基本类型不会给你执行初始化,是随机值
wade_2003 2010-05-11
  • 打赏
  • 举报
回复
类成员的初始化只是构建这个成员,把它初始化为一个随机的值?
是啊,是随机初始化的,怎么可能值一样呢
aweer 2010-05-11
  • 打赏
  • 举报
回复
都是随机值 怎么可能相同
nashzh 2010-05-11
  • 打赏
  • 举报
回复
不明白,围观,等待解答

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧