昨天做SGU134时遇到了类类型对象没有被初始化的问题,于是引起对编译器合成的默认构造函数的猜测,后来在瀚海星云得到解答如下:

发信人: windywinter(WindyWinter), 信区: CPlusPlus
标 题: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日18:47:12 星期一), 站内信件 WWWPOST

有如下类:
struct vertex
{
bool visited;
long assonum,noc;
edge *link; //edge is anthor class
};
那么编译器会合成什么样的构造函数?
与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?

我实验了
int main()
{
vertex vertexes[10000];
return 0;
}

MS让编译器自己合成构造函数的话,vertexes是没有经过初始化的,而自己写构造函数
则正常初始化。

--
My Blog: http://turingdream.com

※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 221.238.147.227]

发信人: jlw(STILL FANTASY), 信区: CPlusPlus
标 题: Re: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日19:24:20 星期一), 站内信件

你在什么下测试的?
【 在 windywinter (WindyWinter) 的大作中提到: 】
: 有如下类:
: struct vertex
: {
: bool visited;
: long assonum,noc;
: edge *link; //edge is anthor class
: };
: 那么编译器会合成什么样的构造函数?
: 与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?
:
: .................(以下省略)

--
为什么每天都要睡觉?
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 202.38.79.187]

发信人: zorro(现实很残酷,我仍需思考……), 信区: CPlusPlus
标 题: Re: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日19:35:18 星期一), 站内信件

【 在 windywinter (WindyWinter) 的大作中提到: 】
: 有如下类:
: struct vertex
能这样定义类吗?
: {
: bool visited;
: long assonum,noc;
: edge *link; //edge is anthor class
: };
: 那么编译器会合成什么样的构造函数?
: 与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?
:
: .................(以下省略)

--
困惑中我们从未放弃过思考,这是科大人的秉性;
困难中我们从未放弃过努力,这是科大人的品质;
困境中我们从未放弃过骄傲,这是科大人的血统。
与生俱来的精英意识,出类拔萃的教育水平,时刻感受危机的心态,
都是科大人终将克服所有意料之中与意料之外的艰难险阻并重写壮丽史诗的决定性因素。
我为自己能称为科大人而自豪,明天科大会因我而自豪!!
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 218.79.103.113]

发信人: PRINECESS(衣一), 信区: CPlusPlus
标 题: Re: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日22:26:49 星期一), 站内信件 WWWPOST

【 在 zorro 的大作中提到: 】
: 【 在 windywinter (WindyWinter) 的大作中提到: 】
: : 有如下类:
: : struct vertex
: 能这样定义类吗?
: : {
: : bool visited;
: : long assonum,noc;
: : edge *link; //edge is anthor class
: : };
: : 那么编译器会合成什么样的构造函数?
: : 与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?
: :
: : .................(以下省略)
这个是一个结构体?

--
据说,如果男人的小拇指的周长是女生中指的周长........
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 202.38.73.138]

发信人: prozax(haohao), 信区: CPlusPlus
标 题: Re: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日22:30:58 星期一), 站内信件

翻了一下inside cpp object model
通常编译器产生的默认构造函数什么都不干
给成员变量赋0值初始化是你的工作而不是编译器的工作,so编译器什么也不会替你干
cpp标准这么说的.

有4种情况编译器生成的默认构造函数不是什么都不作:
1.当这个类有一个带有默认构造函数的成员对象;
2.当这个类继承自一个带有默认构造函数的基类;
3.当这个类或这个类的继承体系中声明有虚函数;
4.当这个类有一个虚基类.

对1,2,编译器保证用成员对象或基类的构造函数初始化它们;
对3,4,语言特性需要虚函数指针的支持,所以要在构造函数内隐式的生成一个虚函数指针
.
that's all.
【 在 windywinter (WindyWinter) 的大作中提到: 】
: 有如下类:
: struct vertex
: {
: bool visited;
: long assonum,noc;
: edge *link; //edge is anthor class
: };
: 那么编译器会合成什么样的构造函数?
: 与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?
:
: .................(以下省略)

--
╭════╮╭════╮╭════╮
║╔ ║║╔ ╭╮║║╔ ║
║║ ╭╮║║║ ╰╯║║║╭╮ ║
║ ╰╯║║ ╭╮║║ ╰╯ ║
║ ╭═╯║ ║║║║ ║
╰══╯ ╰══╯╰╯╰════╯
※ 修改:·prozax 于 04月02日22:40:10·[FROM: 211.86.146.227]
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 211.86.146.227]

发信人: flyingduck(飞鸭-dibao归来), 信区: CPlusPlus
标 题: Re: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日23:19:33 星期一), 站内信件 WWWPOST

可以吧,就是默认的成员都是public
【 在 zorro 的大作中提到: 】
: 【 在 windywinter (WindyWinter) 的大作中提到: 】
: : 有如下类:
: : struct vertex
: 能这样定义类吗?
: : {
: : bool visited;
: : long assonum,noc;
: : edge *link; //edge is anthor class
: : };
: : 那么编译器会合成什么样的构造函数?
: : 与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?
: :
: : .................(以下省略)

--
绕着操场跑100圈,可以成仙
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 210.77.10.97]

发信人: flyingduck(飞鸭-dibao归来), 信区: CPlusPlus
标 题: Re: 问一个有关默认构造函数的问题
发信站: 瀚海星云 (2007年04月02日23:23:24 星期一), 站内信件 WWWPOST

变成死相里159页有讲,默认构造函数不会把内存置零
【 在 windywinter 的大作中提到: 】
: 有如下类:
: struct vertex
: {
: bool visited;
: long assonum,noc;
: edge *link; //edge is anthor class
: };
: 那么编译器会合成什么样的构造函数?
: 与 vertex():visited(0),assonum(0),noc(0),link(0){}; 有区别吗?
:
: 我实验了
: int main()
: {
: vertex vertexes[10000];
: return 0;
: }
:
: MS让编译器自己合成构造函数的话,vertexes是没有经过初始化的,而自己写构造函数
: 则正常初始化。

--
绕着操场跑100圈,可以成仙
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 210.77.10.97]