C++ 学习笔记 Const 用法
const几种用法
const 修饰成员变量
#include<iostream>
using namespace std;
int main()
{
int a = 3;
const int b = 4;
int* b2 = (int* )&b; // 此时可以修改,编译可以通过,但执行时会报错,因为b是存储在字母表中,无法直接修改
const int a2 = a; // 常量局部变量,无法直接修改,但是可以通过指针的方式修改其内容
int * a3 =(int*) &a2; // 可以通过这种方式修改局部常量,但注意需要强制转换类型
const int* a4 = &a; // 指针为常量,内容可以修改
int *const a5 = &a; // 指针可以修改,内容为常量
int const * const a6 = &a; // 常量指针,内容也为常量
const int * const a7 = &a; // 常量指针,内容也为常量
return 0;
}
const修饰指针变量时要注意:
- const 在星号*左侧时,表示内容是常量,无法修改
- const 在星号*右侧时,表示指针是常量,无法修改
- const 在星号*两侧都有的时候,表示指针和内容都是常量,均无法修改
const作为局部常量并用变量初始化的时候, 变量是存在栈上的,因此可以通过引用或指针的方式去修改其值,但全局常量不可以
const 修饰函数参数
传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。
void testModifyConst(const int _x) {
_x=5; ///编译出错
}
const 全局常量
const 的全局常量是存储在静态存储区的,用户可以通过指针或者引用的方式去修改这个值,在编译阶段不会报错,但是运行时会抛出异常.
const 修饰返回值
- 指针传递
如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。
const int * mallocA(){ ///const data,non-const pointer
int *a=new int(2);
return a;
}
int main()
{
const int *a = mallocA();
///int *b = mallocA(); ///编译错误
return 0;
}
- 值传递
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。
所以:
-不要把函数int GetInt(void) 写成const int GetInt(void)。
-不要把函数A GetA(void) 写成const A GetA(void),其中A 为用户自定义的数据类型。
const 放在成员函数之后
class A
{
public:
// 此时const表示该函数不能对成员变量修改 , 但是却可以修改mutable变量
// 同时,const修饰的成员函数也是不能调用非const成员函数的
void GetA() const;
}
const 外部链接属性
- 在c语言下, 默认const全局常量为外部链接属性
- 在c++语言下, 默认const全局常量为内部链接属性
const 内存分配
- 对const修饰的变量取地址时候去分配临时内容
void test()
{
const int m_A = 10;
int *p = (int*)&m_A; // 此时会分配临时内存
}
- const前加入extern关键字后,也会分配内存, 但是无法通过引用的方式去修改值
- 使用变量来初始化const修饰的变量
void test()
{
int a = 10;
const int m_A = a; // 此时会分配内存给m_A;
int *p = (int*)&m_A;
*p = 20; // 因为m_A内存是在栈上,可以修改
}
- 自定义类型的常量,也会分配内存

浙公网安备 33010602011771号