C++疑难问题学习
一、引用
1、引用
C++引用是另外一个变量的别名(alias)。对引用的所有修改都会改变该引用所指向变量值。可以把引用看成是一种隐式指针,它可以免除获取变量地址和对指针解除引用的麻烦。
①、引用变量
引用变量必须在创建时就初始化。
[必须在分配引用时对其初始化,通常,引用是在声明时分配的,不过引用数据成员可以在包含该成员的类的初始化列表中进行初始化。]
除非引用指向一个const值,否则不能创建指向未命名值得引用。
int& unnamedRef = 5; // does not compile...
const int& unnamedRef = 5;//OK
②、修改引用
引用指向的变量在初始化之后不能再改变,只能改变这个变量的值。
③、指针引用和引用指针
可以创建指向任何类型的引用,包括指针类型。
例:int* intP;
int*& ptrRef = intP;
ptrRef = new int;
*ptrRef = 5;
注:不能声明指向引用的引用,也不能声明引用指针(指向引用的指针)。
2、引用数据成员
类的数据成员可以是引用,必须在构造函数初始化列表中初始化引用数据成员,而不是在构造函数体中完成初始化。
3、引用参数
C++程序员不常使用独立的引用变量或者引用数据成员,最通常的用法是作为函数和方法的参数。
①、来自指针的引用
例:int x = 5, y = 6;
int *xp = &x, *yp = &y;
swap(*xp, *yp); //接收引用参数
②、传引用和传值
传引用可以避免复制函数实参,在某些情况下会带来两个好处:
I、效率:对象和结构体的复制会花费很长时间。
II、正确性:不是所有的对象都允许传值,即使允许传值,也不见得就能正确的支持深复制。
4、 引用返回类型
从函数或方法也可以返回引用(效率考虑),不是返回一个完整的对象,而是从函数或方法返回对象引用,可以避免不必要的复制。
[不要返回变量(Stack自动分配)的引用,因为函数结束时会销毁这个变量]
5、 采用引用还是指针
唯一需要使用指针的情况是,需要改变指针指向的位置,因为不能改变引用指向的变量,比如,在动态分配内存时,就需要在指针中存储指向结果的指针,而不是在引用中存储。
二、关键字疑点
1、const关键字(用于标示变量和用于标示方法)
①、const变量
其中一个用法是代替#define来声明常量,可以标示任何变量,包括全局变量和类数据成员。
②、const int* p; //不能改变p指向的值。
int* const p; //把p自己声明为const。
[int const* const p = NULL;] == [const int* const p = NULL;] //指针及其指向的值都是const。
③、const方法
声明方法可以防止方法修改类中不可变的数据成员。
2、static关键字
①、static数据成员和方法
可以为类声明静态数据成员和静态方法。
②、static连接
C++连接概念:
外部连接是指,对于其他源文件,这个名字是可用的。
内部连接(静态连接)是指,对于其他源文件,这个名字是不可用的。
函数和全局变量默认都有外部连接,可以在声明前加static,来指定内部连接。
3、extern关键字
extern用来为位于它前面的名字声明外部连接,
4、函数中的static变量
静态变量的一种用法是“记住”是否已经为一个函数完成过特定的初始化。
三、类型与类型强制转换
1、typedef
typedef为既有的类型提一个新的名字。typedef没有创建新类型—它只是提供了引用原类型的新方法。
类型名最常见的用法是当实际的类型名很有麻烦时可以提供一个可管理的名字,这种情况通常会在模板中发生。(STL大量使用了typedef来定义较短类型名称)
例:typedef basic_string<char> string;
typedef的一个巧妙之处是:类型名可以包含作用域限定符。
例:typedef A::B C;