• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

请教C++里面函数的特殊定义方式

mis98ZB 日电卓越软件科技(北京)有限公司 开发总监  2002-05-31 07:16:05
第一个,以前好象见过,但找不到了:
int clsHehe::FunA(void) const{
return(123);
}

这里的“const”是什么意思呢?


第二个,找不到这种用法的说明:
class clsHeiHei{
public:
clsHeiHei(clsHeiHei* =0);
~clsHeiHei(void);
private:
clsHeiHei* _HeiHei;
};

clsHeiHei(clsHeiHei* hr) : _HeiHei(hr){}

这里的“ : _HeiHei(hr)”什么意思呢?


最后:
前面两种情况都是在参数列表和函数体之间加入了一些东西。
还有一种就是异常处理中的throw声明:void mis98zb() throw(stone,knife)。
那么,
函数的定义中,参数列表和函数体之间都可以加些什么东西呢?


请大家不吝指教。最好能提供些参考的文章。感激不尽!
...全文
15 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
delphihero 2002-05-31
这里的const 限制类的成员函数不改变类的成员变量。
第二个 c++primer 上就有,在 c++里提倡这样初始化,而不是方到函数里面。如 class xx类型 a,b; b//赋值 a=b 这样效率差,如果 class a(b)这样就好多了。 ~~~~~~~ ~~~传值,a 会先调用却省构造函数,再调用赋值函数,而第二种方法 调用a(class xx&)构造函数。
回复
mis98ZB 2002-05-31
再次感谢大家。
结帖了。
回复
webber84 2002-05-31
只有在类的构造函数中可以在参数表后面加上成员初始化列表。别的地方好像不能加什么吧
回复
mis98ZB 2002-05-31
谢谢大家热心的指教!
最后问一个总结性的问题:
C++函数的定义中,参数列表和函数体之间都可以加些什么东西呢?
回复
xijiajia 2002-05-31
1.const表示此函数为常函数,只要它才能操作常对象:
const clsHeiHei a;
a.FunA();----->合法

2.初始化列表

3.抛出表(throw list)
回复
mis98ZB 2002-05-31
《标准C++宝典》是《C++ Standard Library》吗?
回复
SSTS 2002-05-31
你可以看看标准C++宝典这本书..
至余怎么初始化,,水平有限我也不知道.
class中的 const 类型也必须在成员初始化表中进行初始化..
指针就不一定..
回复
Muf 2002-05-31
1. 这里的“const”是什么意思呢?
--> 表示 this指针所指的对象是个const对象。也就是说这个函数不希望修改类本身的任何成员内容。
参见:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_langref_constant_member_functions.asp

2. clsHeiHei(clsHeiHei* hr) : _HeiHei(hr){}
这里的“ : _HeiHei(hr)”什么意思呢?
-->在构造函数中对类成员的初始化。
按c的观念,对一个数据初始化需要给个初值,然后_HeiHei= hr就完事了。
但c++的类成员变量初始化,推荐放到构造函数的初始化中完成:
clsHeiHei(...): 初始化列表 {}
这里初始化列表格式就是: _HeiHei(初值), 其它变量(初值)

3.void mis98zb() throw(stone,knife)
-->表示这个函数将可能会产生stone和knife异常,也只会产生这两个异常
但由于部份编译器(如VC6)对标准支持不好,实际上throw列表被忽略,但还是要按标准写程序。
回复
mis98ZB 2002-05-31
SSTS(铁冰):
谢谢你的回复!
_HeiHei是个指针,hr也是个指针,
它们是怎么初始化的呢?

我翻了好多书,甚至把ISO那本《Programming Language c++》都找了一下,都没有看到这方面的介绍。能告诉我那些书上有介绍吗?(能买的到的书我几乎都买了)

至于void mis98zb() throw(stone,knife){},只是逗乐而已啦。。。。。。
回复
nix3m 2002-05-31
_HeiHei(hr)可能是对被继承类的数据成员进行赋值,赋值方法类似于
int m(0);
回复
SSTS 2002-05-31
随便打本C++的书籍应该都有介绍..
但像这种:void mis98zb() throw(stone,knife)
就不是每本C++的书都会介绍..
回复
SSTS 2002-05-31
clsHeiHei(clsHeiHei* hr) : _HeiHei(hr){}

这是成员初始化列表的标准形式...
记住是初始化,,不是复值..
像这样:
char *chTest="Test!!!!!";//这是初始化.

char *chErr;
chErr="Test!!!!!"; //这是不行的.

所以class里的指标和引用,,必须用成员初始化列表..
当然,指针可以在构造函数里动态分配内存..
回复
webber84 2002-05-31
这只不过是赋值的另外一种语法而已。如int a(2)与int a=2是一样的。
回复
mis98ZB 2002-05-31
谢谢大家关注!

kingofhell(地狱之王) :
clsHeiHei* _HeiHei,那么_HeiHei应该是个指针,
_HeiHei(hr)怎么会等价于_HeiHei = hr呢?
想不通,
请详细说明。
回复
kingofhell 2002-05-31
第一个:表示该函数是个只读函数,他不能修改任何成员变量,也不能调用任何非只读函数。
第二个:_HeiHei(hr)等价于_HeiHei = hr
回复
wangweilie 2002-05-31
第一个问题: 禁止该成员函数改变成员数据。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-31 07:16
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……