C++中易记混知识点总结(长期更新)
1、const指针和引用
const int &a;//引用对象为const,但实际上只是a一厢情愿为const引用,应用对象可以为普通变量,但a仍不能改变其值(特别注意在函数形参中的使用)。
const int *a;//指向常量的指针,和上面常量引用一样是一厢情愿,注意从右向左看,a首先是一个指针,指向一个const int。
int *const a=&cc;//从右往左看,a首先是一个常对象,其次是一个指针,说明是一个常指针,常指针必须初始化,之后便不能改变。引用不是对象,不存在本身是const的引用。
不能将一个指向(引用)常量的指针(引用)赋值给一个普通指针(引用),这样有可能造成所指(引用)对象改变。
2、复杂度数组、函数声明
int *p[10];//从左往右看,首先由[10]看出p是一个数组,再看*可以知道数组中存储的是指向int的指针,可以理解为(int *) p[10],此语句定义的是一个数组。
int (*p)[10]=&cc;//先从括号内向外,p前面有*,在定义中一定是指针,所以p是指向数组的指针,数组内容为int类型,此条语句定义的就是一个指针p。
int &p[10];//没有这种写法
int (&p) [10];//数组本身是对象,所以允许定义数组的指针和引用,从内向外看,p前面有&,所以p为引用,是数组的引用。
int *p();//从右往左看,表示函数p返回值是(int*)。
int (*p)();//从内往外,p是一个指针,指向一个函数。
定义一个返回指针且指针指向一个数组的函数有两种方法:
一是使用类型别名
typedef int arrT[10];//arrT是一个类型别名,表示的类型是含有10个整数的数组,等同于using arrT=int[10]
arrT* func(int i);//此函数返回指针,指向一个arrT类型,也就是一个含10个整数的数组。
二是如下
int (*func(int i))[10];//从内向外,func返回一个指针,(*func(int i))解引用为一个数组名,所以此语句定义一个返回指针的函数,指针指向一个int 数组。
int *(&array) [10] =ptrs;//int *ptrs[10],从内向外看,array是一个引用,引用一个数组,数组内容为(int *)类型。此语句定义的是array,所以初始化给的是ptrs。
3、指向数组的指针
int *matrix[10];//定义了一个由十个int指针组成的数组。
int (*matrix) [10];//定义了一个指针,指向含有10个整数的数组。
int matrix[] [10];//同上一个,matrix[]==(*matrix)。
4、类模板和模板类
一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。模板类其实是类模板的实例化产物&#