const与基础数据类型
- 声明基础数据类型常量:
const <type> <name>
<type> const <name>
const
关键字一般用来修饰常量,例如我们使用const int MAX=100
来声明一个常量,一旦一个常量被声明了以后,对它的修改都将引发错误- 我们也可以将
const
写在类型名后面,这和写在前面等效 - 一般情况下,常量名为大写
const与对象
- 声明常对象:
const <type> <name>
<type> const <name>
- 常对象的所有数据成员都不能被修改
- 如果一个对象被声明为常对象,则不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。
- 常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中数据成员的值。
- 只能通过构造函数的参数初始化表对常数据成员进行初始化
- 常对象可以有非常成员函数,只是不能被常对象所使用
const与指针
常量指针
指针可以被修改,但是不能通过该指针修改指向的内容,所以被指向的数据不能被修改
声明常量指针:
const <type> *<name>
<type> const *<name>
- 举例:
int x=3;const int *p=&x
- 此时常量指针p的
*p
不能修改,而p
可以修改 p=&y
//修改所指向的地址,正确*p=4
//修改所指向的内容,错误
- 此时常量指针p的
指针常量
- 指针不能被修改,但是可以修改指针指向的内容,即被指向的数据能被修改
- 声明指针常量:
<type>* const <name>
- 举例:
int x=3;int* const p=&x
- 此时指针常量p的
p
不能被修改,而*p
可以修改 p=&y
//修改所指向的地址,错误*p=4
//修改所指向的内容,正确
- 此时指针常量p的
常量指针和指针常量的结合
- 若声明为:
const <type>* const <name>
,则指针本身和其所指向的数据都不能被修改 - 举例:
int x=3;const int* const p=&x
p=&y
//修改所指向的地址,错误*p=4
//修改所指向的内容,错误
const与引用
注意:引用必须初始化并且永远指向它初始化的对象,不能被再次修改,这点和指针不同
常引用
- 引用本身不可以被修改,也不能通过引用修改所引用的内容,即引用对象不能被修改
- 声明常引用:
const <type> <name>
<type> const <name>
- 举例:
int x=3;const int &y=x
x=4
//直接通过x修改内容,正确y=4
//通过常引用修改内容,错误
const修饰函数
const修饰函数参数
- 与
const
修饰变量时类似,如果const
修饰了一个函数的参数,那么这个参数就不能在该函数内部被修改 - 举例:
void setx(const int a){
a=3;//尝试修改const修饰的变量,编译出错
}
const修饰成员函数
const
修饰成员函数实际上是隐含传入的this
指针为const
指针,所以不能通过const
函数修改成员变量const
修饰的成员函数不能修改任何成员变量(可以修改mutable
修饰的变量)const
修饰的成员函数可以修改static
修饰的变量,因为static
修饰的变量不属于对象,可以全局访问,不需要this
指针来修改const
成员函数不能调用非const
函数,因为该函数可能修改成员变量- 举例:
class test{
static int b;
int a;
int testFuction() const//const在函数名后面
{
a=3;//错误,不能修改成员变量
b=4;//正确,可以修改静态数据成员
testFun1();//错误,不能调用非const函数
testFun2();//正确,可以调用const函数
};
int testFun1(){};
int testFun2() const{};
}
int test::b=0;//静态数据成员要在类外初始化