virtual,inline,friend,volatile,mutble,export

来源:互联网 发布:网络用语ddp是什么意思 编辑:程序博客网 时间:2024/06/05 00:40

1.virtual 

对于面向对象为特点的C++来说,如何实现多态是一种重要的技术,其中就涉及到virtual关键字的使用。

virtual与成员函数

virtual修饰成员函数时表明此方法可被动态调用,具体使用基类的还是子类的要首先看对象生成的是子类的指针还是基类的,接下来再看是否存在函数的覆盖(函数的重载与多态以及virtual一点关系都没有),总之在virtual修饰的会优先调用子类中的变量和方法。

virtual与纯虚类(包含纯虚函数的类)

包含纯虚函数的类是不能实例化对象的,但是可以进行指针的操作,此类就是实现了接口的功能,在子类中必须实现继承的纯虚函数。

virtual继承


virtual需要注意的问题

virtual是一种动态绑定的机制,所以对用一些静态绑定机制的关键字就不能使用virtual关键字,例如,static,构造函数,内联函数,友元函数,其中的道理是这样的,对于static来说其属于类的所有实例,所有不存在动态绑定的问题,对于内联函数来说,内联函数在编译时就展开,对于virtual这种动态绑定来说是矛盾的;构造函数不能使用virtual(析构函数却建议使用virtual,防止内存泄漏(子类),实现多态时),逻辑推理下,如果构造使用virtual则会首先调用子类的构造,而子类的操作是基于基类对象进行操作,而此时并没有基类对象,所以,必须先进行基类的构造;友元函数不参与继承,所以对一个没继承关系的函数使用动态绑定的操作是完全没有意义的。

2.inline

 inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般的,用户可以阅读函数的声明,但是看不到函数的定义。

1. C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。
2. 这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。
3. 在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。
4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。、

在类中的使用
INT GetWidth(){return m_lPicWidth;}; //如果在类中直接定义,不需要用inline修饰,编译器自动化为内联函数;
如果在类外定义必须在头文件中进行定义
此外还有一些规则需注意:
1、inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。
2、在调用内联函数时,要保证内联函数的定义让编译器"看"到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。但如果你习惯将函数定义放在CPP文件中,或者想让头文件更简洁一点,可这样做:
1
//SomeInline.h中
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef SOMEINLINE_H
#define SOMEINLINE_H
Type Example(void);
//........其他函数的声明
#include"SomeInlie.cpp" //源文件后缀名随编译器而定
#endif
//SomeInline.cpp中
#include"SomeInline.h"
inline Type Example(void)
{
//..........
}
//...............其他函数的定义
以上方法是通用、有效的,可放心使用,不必担心在头文件包含CPP文件会导致编译错误。
inline本身还是有另外一个意义

一个可执行文件的cpp文件中一个函数只能被定义一次。如果你把函数定义在一个.h文件中并让两个cpp包含就会造成这个函数分别在两个cpp中被定义产生错误。但是inline函数是允许在多个cpp中多次定义的,就解决了这个问题。(已验证)

//在类中的使用来自于百度百科

3.friend友元函数

友元函数不属于类中的成员函数,所以不存在继承问题,声明需在类中(加上friend关键字),友元是单向其不具备传递性,友元函数可以访问所在类中的非公有变量,当然可以存在友元类,友元类中的函数可以访问所在类中的非公有变量。

4.volatile

去掉编译器的优化,例如变量的读取,编译器优化读取将变量copy到缓冲寄存器中,而volatile确保每次读取都从内存地址中读取。
volatile可以与const一起修饰,volatile并非是const的反义词,可以说所有非const的就是const的反义词。看下很有意义

5.mutable和export

mutable用的较少,当const函数想修改类中常变量时可以在变量前加上mutable意为可修改的意思。
export主要意图是完成一些extern不能完成的事情,例如到处一个模板类export template <class T> class A{A(T a){}};类似的export template<class T> void out (const T& t) {std::cerr << t;}




1 0
原创粉丝点击