第一章
作用域限定符
限定符::成员名
限定符一般就是类名,也可能是命名空间,用于类成员的访问及定义,用于说明某一成员属于哪一个类,属于哪一个命名空间。若限定符省略,则说明后面的成员是一个全局变量
const常量
1定义时必须初始化
2为右结合,但若是简单数据类型,const也可以写在数据类型的左侧,如
const int i=5;
int const i=5;
const还可修饰函数的形参,表示相应的实际参数在该函数内不能被修改
常引用
引用声明时必须初始化,即指定它引用的是哪一个变量
系统不会为变量的引用另外分配存储空间,引用和被引用的变量共享同一内存单元
常引用语法
const 数据类型 &引用名
如果在声明引用时用const修饰,那么该引用就是一个常引用。意味着所引用的对象不能更改
首先进一步理解引用: int &a=b 相当于 int *const a=b。即引用是一个指针常量(又称常指针,即一个常量,其类型是指针,表示这个指针只能指向这个地址,不能改变指向其他地址)。
每当编译器遇到引用变量a,就会自动执行 * 操作。
而常引用:const int &a=b就相当于 const int * const a=b。不仅仅是a这个地址不可修改,而且其指向的内存空间也不可修改。
常引用的作用有两个,一是让变量所指向的内存空间只读,二是能够指向常量
int * const p1=&a;//这里必须赋值,因为是常指针
p1不能指向别处
// const int *p2;
int const *p2;//这两种定义方式都可以
不能通过p2修改其所指向地方的值
const int * const p3=&a;//这里必须直接赋值
包括以上两种情况,p3既不能指向别处,也不能通过p3修改被指向地方的值
int &c = a;//引用c和a等价,可以互相改变(相当于常指针,即只能指向a的指针)
int & const d = a;//个人感觉这里const没啥用啊!等价于int &d=a
const int & e = a;//等价于int const &e=a。不能通过e修改a的值
const int & const f=a;//f不能赋值,但是a却可以赋值。效果和上一个相等
const int * &p12 = p10;//p12是一个指针引用,是p10的引用,所以p12也是一个指针,和p10指向同一个地方,const在最前面,所以不能通过p12改变所指地方的值。但是p12还能指向其他地方。
int *const &p16 = p14;//引用,p16与p14等价,这里p16只能和p14一样指向a,不能指向其他地方了。但是可以改变a的值。
常对象
如果希望一个对象自创建时起就不能被修改状态,可以用const修饰这个对象,将它声明为常对象。
类名 const 对象名(实参表)
const 类名 对象名(实参表)
常对象在生命的同时必须初始化,并从此不能改变其状态。
This指针不能指向常对象,所以常对象不能调用成员函数。通常是将常对象的引用作为参数传递给函数。
常对象只能调用类的常成员函数和静态成员函数。
常成员函数
返回类型 函数名(参数表) const
常对象不能调用普通成员函数,能调用常成员函数
常成员函数只能访问对象的数据成员,而不能修改他们的值,也不能在函数体中调用非const修饰的成员函数。
当两个成员函数原型相同,只区别在有无const修饰的时候,系统可以视之为重载函数,并根据调用的对象来匹配对应的函数:常对象调用常成员函数,普通对象调用普通成员函数。
常数据成员
构造函数对常数据成员初始化必须使用初始化列表。
对象创建之后,任何函数不能修改常数据成员的值。
如果类有多个重载构造函数,每个构造函数都需要初始化常数据成员。
内联函数inline
带默认参数的函数
Void fun(int a, int b,int c=199)
默认参数的形参位置必须放在最右边
new和delete
new的返回值:若是非数组类型,返回指向该类型对象的指针;若是数组类型,返回数组的首地址
new不一定总会成功,不成功返回NULL
new为数组申请内存时无法提供初值
delete操作符格式:
delete 指针变量
delete []指针变量
预处理命令
以#号引导
预处理命令包括宏定义命令,文件包含命令,条件编译命令