C++查漏补缺读书笔记三 指针与引用,动态绑定与静态绑定

来源:互联网 发布:软件项目实施阶段 编辑:程序博客网 时间:2024/06/01 10:05

本节本想说的是动态绑定,结果发现这个指针和引用的区别有必要也复习一下


动态绑定与静态绑定

静态绑定:编译时绑定,通过对象调用。
动态绑定:运行时绑定,通过地址实现。并且只对虚函数有效。

所以有上述定义可发现,只有指针和引用来调用虚函数才能实现动态绑定,其余的都属于静态绑定。
下面用代码来描述下
class CBase{public:    virtual int func() const    //虚函数    {        cout<<"CBase function! ";        return 100;    }};class CDerive : public CBase{public:int func() const        //在派生类中重新定义虚函数    {        cout<<"CDerive function! ";        return 200;    }};void main(){    CDerive obj1;    CBase* p1=&obj1;    CBase& p2=obj1;    CBase obj2;    obj1.func();    //静态绑定:调用对象本身(派生类CDerive对象)的 func 函数    p1->func();    //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数    p2.func();    //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数    obj2.func();    //静态绑定:调用对象本身(基类CBase对象)的函数p2.CBase::func(); //静态绑定:调用指定类的指定函数}



C++的多态性
                       
 静态多态性:函数多态性——函数重载
                           模板多态性——C++模板(类模板、函数模板)
 动态多态性:虚函数(只有用地址才能实现动态多态性),等价于动态绑定。



指针与引用
什么是引用?
引用也是地址,只不过这个地址是不可更改的。
引用声明时就要赋初值,并且后续不可更改
引用的形式:
int a;
int& b=a;
int& c=b; //引用可以初始化引用,同指针一样
引用的主要功能:
递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、 指针传递和引用传递。 


指针和引用的区别:
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在声明时被初始化一次,之后不可变;指针可变;
4. const引用只能指向const对象,非const引用只能指向非const对象;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,
但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样
指针的++运算表示指向数组的下一个地址,而引用的++则要根据其对象的具体类型有关

编码中指针与引用的取舍相关观点:
Move Effiective C++ 第一条就有
使用指针:
一、是你考虑到存在不指向任何对象的可能
二、是你在不同时刻指向不同的对象
如果你总是指向一个对象并且一旦指向的对象后就不会改变指向,那么你应该使用引用
当你知道必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,
你不应该使用指针。而除此之外的其它情况下,刚应该使用指针

C++设计哲学就是用“引用”代替“指针”,即能使用“引用”的时候就不使用“指针”。
其实,“引用”在现代编译体系结构下底层实现就是一个“指针”,但是其类型安全由编译器替你去完善,比如你可以引用”空指针“,但是如果你使用“空引用”在编译器就不会通过,所以说用引用更安全也更方便。
对于多态,很多人认为只有指针才能实现,其实用引用也是正确的,要是还不明白就看看《Inside The C++ Object Model》

其实就我的观点,指针灵活,引用安全,还是要看不同的需求来使用它们,但是我也赞成不需要使用指针的时候就使用引用。




谢谢你的阅读




0 0
原创粉丝点击