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;//静态数据成员要在类外初始化

被折叠的 条评论
为什么被折叠?



