C++ const使用详解
1.const常量和宏常量
const int max=100;
#define max 100;
const常量相对宏常量有两个有点:
1)有类型安全检查
2)占用内存空间少
2.const变量在内存中的位置
我们在C程序的内存布局中,已经通过示例进行了说明
#include <stdio.h> const int a = 10; ////全部常量a int main() { const int b = 20; //局部常量b int* pa = (int*)&a;//报错,因为全部常量放在只读数据段 int* pb = (int*)&b;//修改成功,因为局部常量放在栈上 *pa = 30; *pb = 30; return 0; }
3.const常成员变量的初始化
在某个对象生存期内是常量。
class Test { public: const int a; Test(int i):a(i){} }
const常量只能通过初始化列表的方式进行初始化。
4.const修饰对象
该对象不能修改。只能访问成员变量,不能修改。只能调用常成员函数。
关于常成员函数,我们在后面介绍。
如下例所示:
#include<iostream> class Test { public: int a; void fun0(){} void fun1() const{} }; int main() { Test test; const Test& a_test = test; std::cout<<a_test.a<<std::endl;//正常,访问公共成员a a_test.fun0();//报错,对象包含与成员函数不兼容的类型限定符 a_test.fun1();//正常 return 0; }
5.const修饰指针
我们看一下下面四种写法:
1) const int* a = 10; 2) int const *a = 10; 3) int* const a = 10; 4) const int* const a = 10;
我们需要知道的是,
const在*左,表示指针指向的内容为常量,这也是我们平时说的常量指针
const在*右,表示指针本身为常量,这也是我们平时说的指针常量
因此,1),2)表示指针a指向的内容不能修改
3)表示指针a本身不能修改
4)表示指针a和a指向的内容都不能修改
6.const修饰成员函数,函数参数,返回值
1)修饰成员函数
void fun1() const;
成员函数名后加上const,即表明该函数为常成员函数。
常成员函数的const隐式修饰this指针,即对象不可修改,
所以,常成员函数只能访问成员变量,而不能修改。只能调用其他常成员函数。
如下例所示:
int g_a; void g_fun(){} class Test { public: void fun0(){} void fun1() const{} void fun2() const { a = 10;//报错,“必须是可修改的左值” fun0();//报错,对象包含与成员函数不兼容的类型限定符 fun1();//正常,可调用其他常成员函数 g_a = 10;//正常 g_fun();//正常 } private: int a; }
2)修饰函数参数
void fun0(const Test* p_test); void fun1(const Test& test);
在传入的参数前,加上const,表明传入的参数不可修改。
3)修饰函数返回值
const Test fun0(); const Test* fun1();
当使用const Test* fun1();返回指针时,该返回值只能赋给const修饰的同类型指针。
如下例所示:
class Test { public: void fun0(){} const Test fun1(){ return *this; } const Test* fun2(){ return this; } }; int main() { Test test; Test r = test.fun1(); const Test* rp = test.fun2(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架