一、基本知识
1、const
常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。
二、面向过程设计用法
(1)const修饰一般常量及其数组
表示const修饰的变量值是不可改变的。
const int a=10;
const int arr[3]={1,2.3};
也可以写成以下形式
int const a=10;
int const arr[3]={1,2.3};
int const和const int的作用一样。
(2)const修饰指针变量*及其引用变量&
int a=7;
//指针所指向的内容是常量不可改变
int const *b=&a;//const位于*左侧,则const用来修饰指针所指向的变量,即指针指向为常量
const int *b=&a;
//指针本身是常量不可改变的
(int*)const b=&a;//const位于*右侧,const修饰指针本身,即指针本身是常量
const (int*)b=&a;
const int* const b=&a;//指针本身和指向的内容均为常量
(3)const修饰成员函数的返回值
const void fun();
void const fun();
(4)const修饰成员函数的形参变量
//传过来的参数在函数内不可改变(无意义)
void fun(const int val);
void fun(int const val);
修饰指针可以防止指针被修改。
void function(const int *a);//参数指针所指向内容为常量不可改变
void function(int* const a);//参数指针本身为常量不可改变
(5)修饰引用参数
修饰引用参数,参数的值不能被修改,失去了引用类型的目的,但传递对象时,可以起到不复制对象的目的。
//传递时,不需要复制一个新的ClassA,又能保护a
void test(const ClassA& a)
{
}
void function(const Class& var);//引用参数在函数内不可改变
void function(const Type& var);//引用参数在函数内为常量不可改变
三、面向对象设计
1、常对象
常对象在定义时必须要初值,常对象中的所有数据成员的值都不能被修改。
常对象的定义格式:
类名 const 对象名 [(实参表)];
//另一种定义类型
const 类名 对象名 [(实参表)];
实例:
Time const t1(12,34,46);
注意:
- 如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数,而不能调用该对象的普通函数。
- 常成员函数可以访问常对象中的数据成员,但不允许修改常对象中的数据成员,即常对象中的数据成员的值绝对不会改变。
2、常对象成员
常对象的数据成员都是常数据成员,因此定义对象时,构造函数只能用构造函数初始化表对常数据成员进行初始化。
const int hour;//定义hour为常数据成员
Time::Time(int h):hour(h){}//通过参数初始化表对数据成员hour初始化
3、常数据函数
如果成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们。
声明常成员函数的形式:
类型名 函数名(参数表) const;
常成员函数不能调用另一个非const成员函数。
4、指向对象的常指针
将指针变量声明为const型,这样指针变量始终保持为初值,不能改变,即其指向不变。
Time * const 指针变量名;
举例:
Time * const ptrl=&t1;//指定ptrl指向t1
5、指向常对象的指针变量
定义指向常变量的指针变量的一般形式
const 类型名 *指针变量名;
(1)如果一个变量已经被声明为常变量,只能用指向常变量的指针变量指向它,而不能用一般的指针变量指向它。
const char c[]="boy";
const char *p1;
p1=c;//只能用指向常变量的指针变量指向它