由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - simple question on C++ initialization list
相关主题
C++的"初始化"小结[合集] 关于构造函数
请教c++数组初始化为啥gcc找不到类的构造函数?
初始化列表问题构造函数里的异常处理
c++类未完成初始化,如何引用this?[c++] 关于构造函数的一个小问题
C++构造函数的问题还没被劝退C++的都来看看这个吧
刚看完类这一章,有些大小问题,请指教,谢谢问个构造函数的问题
突然想到一个老题,构造函数n多变量初始化初学者问个 C++ constructor 问题吧
关于构造函数的一道测试题 (转载)没有经过构造函数???
相关话题的讨论汇总
话题: datum话题: derived话题: base话题: 基类话题: 初始化
进入Programming版参与讨论
1 (共1页)
s*******1
发帖数: 20
1
why the following won't compile? Thanks a lot.
error: class ‘Derived’ does not have any field named ‘_datum’
#include
using namespace std;
class Base{
public:
Base():_datum(0.0){};
double datum(){return _datum;}
protected:
double _datum;
};
class Derived:public Base{
public:
Derived():_datum(1.0){};
};
int main()
{
Derived a;
cout << a.datum() << endl;
return 0;
}
r*********r
发帖数: 3195
2
可以放在 initialization list 里的有两种: immediate base classes,
和 members not inherited from a base class.
z****e
发帖数: 2024
3
除了死记硬背,lz可以这样理解这个问题,
在进入constructor的left openning brace { 之前,所有的subobjects 必须被
initilaized。包括基类和所有成员。不论你使用不使用初始化表符。
如果你不使用初始化表符,在进入{ 之前,编译器调用默认的基类构造函数。如果你使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。
好,这就说明,初始化基类的成员,在进入 { 之前,只能通过编译器调用默认的基类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入基类的{ 之前,基类的所有成员,也要被初始化。
所以,Base::_datum,是在进入Base的构造函数的{ 之前被初始化的,而不是你这个派生类的{ 之前。
这个同时也解释了,为什么初始化表符都是比构造函数赋值更高效,因为进入构造函数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋值了。
r*********r
发帖数: 3195
4
解释不用这么罗唆吧. 实际上就是 一个类的 data member 有两种,
一种是继承来的, 一种是在此类中新定义的.
继承来的就要交给对应的基类去初始化.
z****e
发帖数: 2024
5
我是在解释为什么
“继承来的就要交给对应的基类去初始化”

【在 r*********r 的大作中提到】
: 解释不用这么罗唆吧. 实际上就是 一个类的 data member 有两种,
: 一种是继承来的, 一种是在此类中新定义的.
: 继承来的就要交给对应的基类去初始化.

t****t
发帖数: 6806
6
解释得不错, 我想你现在应该认识到, 需要死记硬背的东西确实很少.

使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。
类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入
基类的{ 之前,基类的所有成员,也要被初始化。
个派生类的{ 之前。
数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋
值了。

【在 z****e 的大作中提到】
: 除了死记硬背,lz可以这样理解这个问题,
: 在进入constructor的left openning brace { 之前,所有的subobjects 必须被
: initilaized。包括基类和所有成员。不论你使用不使用初始化表符。
: 如果你不使用初始化表符,在进入{ 之前,编译器调用默认的基类构造函数。如果你使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。
: 好,这就说明,初始化基类的成员,在进入 { 之前,只能通过编译器调用默认的基类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入基类的{ 之前,基类的所有成员,也要被初始化。
: 所以,Base::_datum,是在进入Base的构造函数的{ 之前被初始化的,而不是你这个派生类的{ 之前。
: 这个同时也解释了,为什么初始化表符都是比构造函数赋值更高效,因为进入构造函数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋值了。

z****e
发帖数: 2024
7
关键是有大侠的伟岸身影,时刻督促我前进。
我只是一个在海边捡贝壳的小孩子,
如果说我解释的不错,
也只是因为站在了巨人的肩膀上。

【在 t****t 的大作中提到】
: 解释得不错, 我想你现在应该认识到, 需要死记硬背的东西确实很少.
:
: 使用初始化表符,在进入{ 之前,你自己调用基类的构造函数,(包括copy ctr)。
: 类构造函数,或者你自己调用基类的构造函数来实现。而基类在被初始的时候,在进入
: 基类的{ 之前,基类的所有成员,也要被初始化。
: 个派生类的{ 之前。
: 数{ 以前,必须经历默认的初始化,或者自定义的初始化。进入构造函数以后,都是赋
: 值了。

l******e
发帖数: 12192
8
人才

【在 z****e 的大作中提到】
: 关键是有大侠的伟岸身影,时刻督促我前进。
: 我只是一个在海边捡贝壳的小孩子,
: 如果说我解释的不错,
: 也只是因为站在了巨人的肩膀上。

r*********r
发帖数: 3195
9
ditto

【在 l******e 的大作中提到】
: 人才
t****t
发帖数: 6806
10
确实是人才, 雷得我说不出话来.

【在 l******e 的大作中提到】
: 人才
相关主题
刚看完类这一章,有些大小问题,请指教,谢谢[合集] 关于构造函数
突然想到一个老题,构造函数n多变量初始化为啥gcc找不到类的构造函数?
关于构造函数的一道测试题 (转载)构造函数里的异常处理
进入Programming版参与讨论
r*********r
发帖数: 3195
11
抱粗腿抱得还蛮准的,以后c++的问题都有解了。
z****e
发帖数: 2024
12
抱粗腿?我念粗腿都费劲,不信你试试:
山前住的叫崔粗腿,山后住的叫崔腿粗,
两人山前来比腿,
也不知是崔粗腿比崔腿粗的粗腿,
还是那崔腿粗比崔粗腿的腿粗。

【在 r*********r 的大作中提到】
: 抱粗腿抱得还蛮准的,以后c++的问题都有解了。
B*******g
发帖数: 1593
13
>_< 不做公关或销售可惜了

【在 z****e 的大作中提到】
: 关键是有大侠的伟岸身影,时刻督促我前进。
: 我只是一个在海边捡贝壳的小孩子,
: 如果说我解释的不错,
: 也只是因为站在了巨人的肩膀上。

s*******e
发帖数: 664
14
我觉得zaoxie的话还是蛮真诚的,知遇感恩之情尽在其中呢

【在 B*******g 的大作中提到】
: >_< 不做公关或销售可惜了
c********e
发帖数: 42175
15
嗯,第一句就说了5遍才顺溜。

【在 z****e 的大作中提到】
: 抱粗腿?我念粗腿都费劲,不信你试试:
: 山前住的叫崔粗腿,山后住的叫崔腿粗,
: 两人山前来比腿,
: 也不知是崔粗腿比崔腿粗的粗腿,
: 还是那崔腿粗比崔粗腿的腿粗。

1 (共1页)
进入Programming版参与讨论
相关主题
没有经过构造函数???C++构造函数的问题
糊涂了,请问一个对象访问的基本问题刚看完类这一章,有些大小问题,请指教,谢谢
vector的析构问题突然想到一个老题,构造函数n多变量初始化
protected构造函数可以防止slicing是什么意思?关于构造函数的一道测试题 (转载)
C++的"初始化"小结[合集] 关于构造函数
请教c++数组初始化为啥gcc找不到类的构造函数?
初始化列表问题构造函数里的异常处理
c++类未完成初始化,如何引用this?[c++] 关于构造函数的一个小问题
相关话题的讨论汇总
话题: datum话题: derived话题: base话题: 基类话题: 初始化