const修饰符
常量修饰符,用来限定特定变量,通知编译器该变量不可以修改。使用const修饰符可以避免在函数中对某些不应修改的变量造成可能的改动。
const的使用
1. const修饰常量
对于基本的数据类型,修饰符可以在类型说明前面,可以在后面。
const int a = 100; int const b = 200; const int arr[2] = {1,2};
2. const修饰指针
const修饰指针,分为两种情况,常量指针与常量的指针
- 常量的指针(const数据),不可以修改指针指向的地址的值,但是可以改指针的指向。
- 常量指针(const指针),可以修改指针指向的地址的值,但是不可以修改指针的指向。
// const 数据 const char * p = "hello"; // const 指针 char * const q = "world"; // const 指针 + const 数据 const char * const pq = "!!!!";
3. const修饰函数
const可以修饰函数的参数、返回值以及类型的成员函数。
3.1 const修饰函数参数
const只能修饰输入作用的参数,修饰输出作用的参数没有意义。
修饰函数形参则在函数体内不能修改形参的值。
3.2 const修饰函数返回值
如果返回值为指针,加上const修饰后,内容是不可以修改的。
同时,接收变量也必须是const修饰的。
3.3 const修饰类成员函数
const修饰成员函数是为了保护成员变量,要求const函数不能修改成员变量,否则编译不通过。
函数体内不能修改成员变量的值,增加程序的健壮性。
只有成员函数才可以在后面加const,普通函数后加const无意义。
const修饰成员函数的规则
- const对象只能访问const成员函数(因为非const成员函数可能会修改成员变量),非const的对象可以访问任何成员函数,包括const成员函数。
- 函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载的。
const对象调用const成员函数,非const对象默认调用非const的成员函数。 - const成员函数可以访问所有成员变量(但是不能修改),但是只能访问const的成员函数。
- 非const成员函数,可以访问任何成员,包括const成员函数。
- const成员函数不能修改任何的成员变量,除非变量用mutable修饰。
- 静态成员函数不可以被const修饰。const修饰成员函数实质上是对this指针进行限制,静态成员函数中没有this指针。
#include <iostream > using namespace std; class myclass{ private: int a; mutable int b; public: myclass(){ a = 1; b = 2; } void print() const { int c = 1; // 非成员变量可以修改 c += 1; // mutable 修饰的成员变量可以修改 b += 2; // 成员变量不可以修改 cout << "a:" << a << endl; cout << "b:" << b << endl; cout << "c:" << c << endl; } }; int main(){ myclass mc; mc.print(); return 0; }
4 . const修饰类对象
const修饰的类对象的任何成员都不能被修改,const类对象只能调用const成员函数。