const 简单小结
const 变量
const 放在变量前边时这个变量就变得不可修改,和常量类似,但实际上还是变量,例如本地变量进入函数才有,离开函数会消失。
const int x = 233; //这里必须初始化,或者用下面的方法
extern const int x; //另一种声明const变量的方法可以不赋值 这是个声明!!!
x = 27; //error
x++; //error
int y = x; //ok , copy const to non-const
y = x; //ok , 一样
当const变量当数组值时
const int i = 10;
int m[i]; //ok
int x;
cin >> x;
const int i = x;
int m[i]; //error
const指针
const指针有两种可能,一种是这个指针是const的,或者指针所指的变量是const的。
Class1 a1;
const Class1* a = &a1; //对象是const
Class1 const* a = &a1; //对象是const
Class1 *const a = &a1; //指针是const
//这两种的区别在与
//a是const :
char *const a = 'as';
*a = 'c'; //OK
a++; //error
//指针所指的对象是const: 不可以通过这个指针来修改其对象,这个对象并不是const
const chat* a = 'as';
*a = 'c' //error
需要注意的是 :指针所指的对象是const的意思是不可以通过这个指针来修改其对象,这个对象并不是const
表格可以增强理解:
表格 | int i ; | const int ci = 3; |
---|---|---|
int * ip; | ip = &i; | ip = &ci ;//error |
const int * cip; | cip = &i; | cip = &ci; |
const 的 ci 不能传给非const的指针,因为这样就取消了const对变量的保护。
普通变量可以传给const的指针,但是无法通过*cip对 i 进行修改。
函数参数是const
void fun(const int* p);
int a = 5;
fun(&a); //OK
const int b = a;
fun(&b); //OK
b = a + 1; //error
const 参数保证在函数内无法对传进来的指针对象进行修改。
const的返回类型
const int f1(){return 1;}
int f2(){return 1;}
int main(){
const int j = f1(); //OK
int k = f2(); //OK
return 0;
}
Const 修饰返回值分三种情况。
A:const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
B: const 修饰自定义类型的作为返回值,此时返回的值不能作为左值使用,既不能被赋值,也不能被修改。
C: const 修饰返回的指针或者引用,是否返回一个指向 const 的指针,取决于我们想干什么。
const 对象 成员函数
定义为const的对象不能再修改,所以我们需要const成员函数
class Test
{
public:
Test(int m,int t):cm(m),ct(t){}
int f()const
{
++cm; // error
++ct; // OK
return cm; //OK
}
private:
int cm;
mutable int ct; //被 mutable 关键字修饰的成员可以处于不断变化中
};
成员函数需要在定义和声明中重复const的使用
int day() const;
int day() const {return day;};
不修改数据的成员函数应该声明const,const成员函数对于const对象是安全的。1
个人学习笔记。 ↩︎