1. 值传递,引用传递,指针传递
以上3个概念主要为函数传递参数的方式,对于值传递和指针传递一般都没什么问题,值传递的特点就是局部变量是传递参数的一份拷贝,函数中任何对于参数的修改只是对于拷贝的修改而非变量本身。而指针传递则就修改的是传递进来的变量本身了,因为传递的是变量的内存地址。
引用是C++中的一个概念,是一种介于以上两者之间的应用方式,引用不能为空,任何时候定义的引用必须初始化并且不能改变(别名),而指针则可以改变,并且可以为Null,而引用则不能为Null.
实际上用引用传递的功能都可以用指针传递实现,但是为了做到权限最小,即“用适当的工具做恰如其分的工作”,避免越权操作,所以引用的引入还是很必要的。同时对于非数据成员,值传递必须创建临时对象,需要调用构造,析构函数并消耗空间,而引用则不必这样了。

2. 重载,覆盖,隐藏
这3个特性其实都可以成为多态性(运行时确定),是C++引入的,但是这3种情况却特别容易让人引起误解。具体要点如下:
a.重载比较简单,是位于同一作用域(同一类定义体内)的同名不同参的函数,运行时根据传入参数确定具体调用哪个(只能根据参数不同判断,不能根据返回值类型,同时注意隐式转换引起的二义性)。
b.覆盖是指的在继承中,子类覆盖了父类的同名同参函数,但是要求是父类的函数必须具备virtual关键字。
c.而隐藏规则是最迷惑的,当子类中存在与父类同名但不同参,或者虽然同名同参,但是父类不存在virtual关键字的时候,子类的函数就将父类的函数所隐藏。
示例如下:

class Base{
public:
void f(float x) { }
virtual void g(int x) {}
};
class Derived:public Base{
public:
void f(int x) {}
virtual void g(int x) {}
};
int main(void)
{
Derived b;
Base *pb=&b;
Derived *pd=&b;
pb->f(3.14f); //Base::f(float x)
pd->f(3.14f); //Derived::f(int x) 隐藏
pb->g(2); //Derived::h(int x);
pd->g(2); //Derived::h(int x); 覆盖

}

转载请注明来源:Leoncom-《高质量程序设计指南——区分概念》
Trackback

3 comments untill now

  1. 如果有输出更好…

  2. 对了, 顺便解释一下virtual void g(int x) {};最后的那个;的作用吧

  3. 打错了~~

Add your comment now