C++ 语法的问题, 奇怪的冒号

aaronz 2008-03-14 12:01:03
今天见到这个构造函数, 为什么 World::World(void)后面还跟了":" 再加其他函数呢? 奇怪, ":"后面不是应该是表示继承其他类的意思么? ...

World::World(void)
: background_color(black),
tracer_ptr(NULL)
{}

类似的还有这两个, 很多出现在构造函数里:

ViewPlane::ViewPlane(void)
: hres(400),
vres(400),
s(1.0),
gamma(1.0),
inv_gamma(1.0),
show_out_of_gamut(false)
{}

wxraytracerFrame::wxraytracerFrame(const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, wxT( "Ray Tracer" ), pos, size)
{
wxMenu *menuFile = new wxMenu;

menuFile->Append(Menu_File_Open, wxT("&Open..." ));
menuFile->Append(Menu_File_Save, wxT("&Save As..."));
menuFile->AppendSeparator();
menuFile->Append(Menu_File_Quit, wxT("E&xit"));

...
}


貌似就是本来应该写在{}内的函数内容? 调用的方法? 看来我还需要多多学习基础知识...经验不足

请大家指教, 非常感谢!
...全文
610 29 打赏 收藏 举报
写回复
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaronz 2008-03-16
  • 打赏
  • 举报
回复
恩~加油加油~
xhd3767 2008-03-16
  • 打赏
  • 举报
回复
就是初始化的另一种方式
i_coding 2008-03-15
  • 打赏
  • 举报
回复
大家动作真快啊,希望能接点分嘛

推荐一本书嘛《 c++ primer》
louisebao 2008-03-15
  • 打赏
  • 举报
回复
要加油了啊
aaronz 2008-03-15
  • 打赏
  • 举报
回复
非常感谢同志们~

是不是100分对这种简单的问题来说太多了.... 这么多人这么热情~~ 谢谢谢谢~
星羽 2008-03-14
  • 打赏
  • 举报
回复

World::World(void)
: background_color(black),
tracer_ptr(NULL)
{}

效果等价于

World::World(void)
{
background_color = black;
tracer_ptr = NULL;
}

但第一种效率更高,这样写叫初始化列表

参看

http://blog.csdn.net/ruibird/archive/2007/04/05/1552373.aspx

http://hi.baidu.com/wkylingling/blog/item/f210427adbe765ee2e73b33b.html

http://qyhok.spaces.live.com/blog/cns!71e684ef039e5d6!115.entry
z_kris 2008-03-14
  • 打赏
  • 举报
回复
都回答完了……
abupie 2008-03-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Aaron_Jerry 的回复:]
稍微总结下吧。
构造函数执行过程分两步完成:
1.初始化列表,这里是真正初始化的地方(类常量成员和类对象成员必须在此初始化)
2.构造函数内部主体,这里实际上是赋值.
[/Quote]
比较全面的解答.
注意, 一般的子类如果需要调用父类构造, 也是需要放在初始化列表中.比如
World::World(void)
: background_color(black),
tracer_ptr(NULL) ,
WorldBase() //父类构造函数调用
{}
Aaron_Jerry 2008-03-14
  • 打赏
  • 举报
回复
稍微总结下吧。
构造函数执行过程分两步完成:
1.初始化列表,这里是真正初始化的地方(类常量成员和类对象成员必须在此初始化)
2.构造函数内部主体,这里实际上是赋值.
baihacker 2008-03-14
  • 打赏
  • 举报
回复
对于一个非基本类型成员(如一个class的对象),如果没有零参数的构造函数...
一般就只有放到初始化列表里了..否则无法初始化
Lynn_Ran 2008-03-14
  • 打赏
  • 举报
回复
后面的不是函数,是初始化列表……
zhy282289 2008-03-14
  • 打赏
  • 举报
回复
类的默认构造函数~~
定义时如果你没有直接初始化就调用他~

类似STRING STR1;
调用默认构造函数,为空字符。。。
greadking 2008-03-14
  • 打赏
  • 举报
回复
初始化列表
xbt746 2008-03-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
World::World(void)
: background_color(black),
tracer_ptr(NULL)
{}
用black来初始化 background_color
用NULL来初始化tracer_ptr
这里是初始化,不是赋值

[/Quote]

dubiousway 2008-03-14
  • 打赏
  • 举报
回复
World::World(void)
: background_color(black),
tracer_ptr(NULL)
{}
表示,类成员变量 background_color 用 black 初始化;tracer_ptr 用 NULL 初始化
baihacker 2008-03-14
  • 打赏
  • 举报
回复
构造函数中的初始化列表
常成员,基类的构造函数要写在这里...
  • 打赏
  • 举报
回复
World::World(void)
: background_color(black),
tracer_ptr(NULL)
{}
用black来初始化 background_color
用NULL来初始化tracer_ptr
这里是初始化,不是赋值
  • 打赏
  • 举报
回复
构造函数里面的是
初始化列表
野男孩 2008-03-14
  • 打赏
  • 举报
回复
《C++ Primer》,再看100遍!
Inhibitory 2008-03-14
  • 打赏
  • 举报
回复
今天见到这个构造函数, 为什么 World::World(void)后面还跟了":" 再加其他函数呢? 奇怪, ":"后面不是应该是表示继承其他类的意思么? ...

World::World(void)
: background_color(black),
tracer_ptr(NULL)
{}

这是初始化列表.
初始化列表的功能:用来进行初始化.
虽然在构造函数中也用来初始化,但是有很多东西是必须在初始化列表中进行初始化的:
如调用父类的构造函数,const的数据成员的初始化,类类型对象的初始化都必须在初始化列表中进行,而不是在构造函数中.
#include <iostream>
#include <cstdlib>

class Temp {
public:
Temp(int value) {
std::cout << "Class Temp constructor." << std::endl;
}
};

class A {
public:
A(int value) {
std::cout << "Class A constructor." << std::endl;
}
};

class B : public A {
public:
B(int value) :
A(value), t(value), data(value) {
std::cout << "Class B constructor." << std::endl;
}

Temp t;
const int data;
};

int main(int argc, char *argv[]) {
B b(4);

return EXIT_SUCCESS;
}
加载更多回复(9)
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-14 12:01
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下