重载与覆盖 成员函数被重载的特征
(1)相同的范围(在同一个类中;
(2)函数名字相同
(3)参数不同
(4 关键字virtual可有可无。 覆盖是指派生类函数覆盖基类函数,特征
(1)不同的范围(分别位于派生类与基类
(2)函数名字相同
(3)参数相同
(4)基类函数必须有virtual关键字。
1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有virtual
关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有
virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。
参数缺省值只能出现在函数的声明中,而不能出现在定义体中。
例如:
void Foo(int x =0,int y=0);// 正确,缺省值出现在函数的声明中
void Foo(int x =0,int y=0)// 错误,缺省值出现在函数的定义体中
{
.....
}
为什么会这样?我想是有两个原因:一是函数的实现(定义)本来
缺省值无关,所以没有必要让缺省值出现在函数的定义体中。二是参数的缺省值可能会
改动,显然修改函数的声明比修改函数的定义要方便。
【规则8 如果函数有多个参数,参数只能从后向前挨个儿缺省,否则将导致
函数调用语句怪模怪样。
正确的示例如下:
void Foo(int x =0,int y=0,int z=0);
错误的如下:
void Foo(int x =0,int y,int z=0);
内存分配方式有三种:
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序
整个运行期间都存在。例如全局变量,static 变量。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称动态内存分配。程序在运行的时候 malloc 或 new 申请任意多
少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期
由我们决定,使用非常灵活,但问题也最多。
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针
我们发现指针有一些“似是而非”的特征
(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成 NULL 指针。
阅读(2054) | 评论(0) | 转发(0) |