computer 版 (精华区)
发信人: remember (明天会更好), 信区: program
标 题: 关于 C++自测题(2)
发信站: 听涛站 (2001年09月30日15:11:47 星期天), 站内信件
(2)About Declaration and Definition
>ok,我们来看看以下哪些变量声明的写法是正确的:
>a. Stack stack_a;
>b. Stack stack_b();
>c. Stack stack_c(1024);
应该说,不论三种写法中哪种,编译器都不会对你有什么意见或建议,那么
是说这样都可以声明变量么?错了,b的写法是不能达到我们预期的声明一
个变量的意图的。Stack stack_b();实际上会告诉编译器这是一个函数的
声明,就象我们在c里面的写法一样:一个返回类型为Stack的无参函数。
产生这样问题的原因大概是C++要保持与C的兼容性而作出的默认选择。大家
应该注意此类错误。
>好,接下来我们来看另一个关于函数的声明和定义(或叫实现)方面的问题。
>class MyStack : public Stack{
>public:
> MyStack(int maxsize=1024);
> ...
>};
>
>MyStack::MyStack(int maxsize=1024)
>{
> cout << "MyStack::MyStack(int)\n";
>}
相信编译器会告诉你redifined。C++中有很多东西是只能定义一次的,包括
默认参数的默认值。那正确的写法应该如何呢?那就是在声明和定义之中挑
一处写默认值,而另一个地方只写(int maxsize)。好,我们考虑一下应该
在哪个地方写默认值呢?
通常应该在函数的声明处写,尤其是函数声明在头文件,而函数定义是在cpp
文件的情况下。为什么?显然,大家写cpp的时候会include头文件,自然应
该在头文件中定义这个默认参数的值了,否则编译器无从得知这个参数是个
可省略的默认参数。
>好,接下来我们希望给MyStack增加一个初始化参数,例如是默认栈底元素,
>就int defaultnum吧,ok,下面的写法是否可以通过编译器呢?
>class MyStack : public Stack{
>public:
> MyStack(int maxsize=1024, int defaultnum);
> ...
>};
不可以。C++规定有默认值参数的右边所有参数都需要有默认值。正确写法应该是
:
MyStack(int defaultnum, int maxsize=1024)
>嗯,我们都知道通常的做法是类体声明放在.h头文件,具体函数定义放在.cpp
>文件,但有一种函数例外,请指出:
>a. virtual
>b. inline
>c. Constructors and Destructors
>并解释一下为什么这种函数通常应该放在.h头文件中(当然,不是绝对的)。
是inline函数。函数标为inline的意思是希望编译的时候就复制一个副本,从而
减少调用函数时的压退栈操作(主要为了保存环境,简单说就是区分局部变量和
全局变量)。所以,尤其在以头文件方式让多个cpp文件可调用该函数的时候,
一定要把函数定义放在.h头文件中,否则编译器无从寻找函数的定义,也就无从
展开函数体了。
不过,关于inline,我也有不少疑惑:
书中值出:inline函数内不允许用循环语句和开关语句。可实际似乎可以正常运
行,可能查看一下<<C++ Primer>>是个解惑途径...
书中指出:inline只是一种请求,而没有强制性。大概我还是要翻看另一本书才
能理解这句话的含义...
--
洛阳亲友如相问 一片冰心在玉壶
※ 来源:·听涛站 tingtao.dhs.org·[FROM: 匿名天使的家]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.595毫秒