const修饰符,是平时编程中经常用到的,也是面试容易出现的基础题,故非常有必要来一个全面的总结——共9个要点。
const 用法总结
const 变量 | const int a; | 不能修改值,必须初始化 |
const 类对象 | const MyClass a; | 不能修改成员变量的值,不能调用非 const 函数 |
指向 const 变量的指针 | const int * a; | 指向内容不可变,指向可变 |
const 指针 | int * const a; | 指向内容可变,指向不可变 |
指向 const 变量的 const 指针 | const int * const a; | 指向内容不可变,指向也不可变 |
const 变量作为函数参数 | void myfun(const int a); | 函数内部不能改变此参数 指向 const 变量的指针做参数,允许上层用一般指针调用。(反之不可) |
const 成员函数 | void myfun(void) const; | this指针为 指向const对象的const指针 不能修改 非mutable 的成员变量 |
const 返回值 | const string& myfun(void); | 用于返回const引用 上层不能使用返回的引用去修改对象(就是返回了一个const对象) |
const 成员变量 | const int a; static const int a; | 必须在初始化列表初始化,之后不能改变 static const 成员变量需要单独定义和初始化 |
以上的总结已经非常详细了,基本上一看就懂!似懂非懂也没关系,继续往下看,我们通过代码来演示!相信你一定会懂的。
1、const 变量
非常简单,唯一需要注意的就是必须要初始化。
const int a; //编译器报错,必须要初始化const变量
const int a=5;
2、const 类对象
不能修改成员变量的值,不能调用非 const 函数
#include <iostream>
using namespace std;
class Teacher{
public:
Teacher():age(33){}
int getAge1() const{
return age;
}
int getAge2(){
return age;
}
int age; //方便测试,故设置为公有属性
};
int main()
{
const Teacher t1;
cout<<t1.getAge1()<<endl;
cout<<t1.getAge2()<<endl; //编译器报错,const对象不能访问非const方法
cout<<t1.age<<endl;
t1.age = 36; //编译器报错,const对象不能修改属性
return 0;
}
3、指向 const 变量的指针(const int *)
指向内容不可变,指向可变,也就是指针指向的内存空间只读。
#include <iostream>
using namespace std;
int main()
{
int a=8,b=9;
const int *p = &b;
*p = 0; //编译器报错,常量不可修改
p = &b; //正确
return 0;
}
4、const 指针(int *const )
指向内容可变,指向不可变。指向的空间是可以修改的,指针本身是常量。与第三点相反
#include <iostream>
using namespace std;
int main()
{
int a=8,b=9;
const int *p = &b;
*p = 0; //正确
p = &b; //编译器报错,常量不可修改
return 0;
}
5、指向 const 变量的 const 指针(const int * const)
指向内容不可变,指向也不可变。也就是3,4两点共存的情况。指针本身与指向的空间都不可修改。
6、7、8、9点也就是以上的综合应用罢了。想必你已经霍然开朗了吧!