C/C++重难点解析之关键字(二)

来源:互联网 发布:keynote软件官方下载 编辑:程序博客网 时间:2024/05/12 00:37

本文继续总结关键字,对static、typedef、inline、struct进行总结。
1、static关键字
static用来声明静态变量,被static声明的静态变量和类的static成员保存在静态存储区。静态变量又分为静态局部变量和静态全局变量。
静态局部变量:
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在静态存储区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
静态全局变量:
未经初始化的静态全局变量会被程序自动初始化为0;静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存。
对普通变量和函数来说,被static修饰后都只在当前文件中可见,即使使用extern关键字也无法使用外部文件的static对象,这是明显区别于普通变量和函数的地方。
静态成员变量:
静态成员变量属于整个类所有
静态成员变量生命期不依赖于任何对象
可以通过类名直接访问公有静态成员变量
所有对象共享类的静态成员变量
另外静态成员变量与上述的静态变量一样存储于静态存储区,当然也可以叫全局数据区,一个意思。
静态成员函数:
可以类比静态成员变量,得出相似的结论:
静态成员函数是类中特殊的成员函数
静态成员函数属于整个类所有
可以通过类名直接访问公有静态成员函数
可以通过对象名访问静态公有成员函数
可以通过表格的形式对普通成员函数和静态成员函数做一个对比:

这里写图片描述

2、typedef关键字
typedef关键字是用来给数据类型重命名的,它可以将复杂的数据类型简单化,使代码更加简洁。例:

//将unsigned类型重新命名为u类型typedef unsigned u;//将LinkList类中泛指T类型的Node重命名为Nodetypedef typename LinkList<T>::Node Node;

上面第二行代码说明typedef不仅可以用来给基本数据类型重命名,还可以给自定义的类类型重命名,这样可以瞬间简化复杂类型。

3、inline关键字
inline关键字用来声明内联函数,C++中推荐使用const、inline来代替宏代码片段。通常将功能简单,规模较小又频繁使用的函数声明为内联函数。这可以提高代码的运行效率,因为内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,这样节省了参数传递、控制转移等开销。
内联函数声明:

inline type functionname(形参){//语句块}

内联函数的一些特性:
内联函数声明时,inline关键字必须和函数定义结合在一起,否则编译器会直接忽略请求。
内联函数没有普通函数调用时的额外开销,压栈、跳转、返回等。
c++开发首选内联函数,而不是宏代码块。
现代C++编译器能够进行编译优化,一些函数即使没有inline声明也可能被内联编译,这是默认的。
注意事项:
inline内联编译的限制:
不能存在任何形式的循环语句。
不能存在过多的调件判断语句。
函数体不能过于庞大。
不能对函数进行取址操作。
函数的内联声明必须在调用语句之前。
当然这些限制因编译器而定,对于先进的编译器有些限制不存在了。

4、struct关键字
其实在C++中struct也是类的声明关键字,它和class唯一的区别就是默认访问级别不同:
用struct定义类时,所有成员的默认访问级别为public。
用class定义类时,所有成员的默认访问级别为private。
其它特性与class完全相同。