1.基础用法
2.核心难点: const 修饰指针
3.const 修饰函数参数
4.const 修饰类成员函数
5.const 修饰函数返回值
1.基础用法
最基础的用途是定义"只读变量",本质是带类型的常量,相比C语言的#define有明显优势,有类型检查、遵守作用域规则
#include <iostream>usingnamespacestd;intmain(){// 定义const常量,必须初始化(一旦定义不可修改)constintMAX_SIZE=100;// MAX_SIZE = 200; // 错误!编译器会直接报错:不能修改const变量// 对比#define(无类型检查,预处理阶段直接替换)#definePI 3.14159// PI = 3.14; // 错误,但报错原因是“赋值给常量”,而非类型问题cout<<"MAX_SIZE: "<<MAX_SIZE<<endl;cout<<"PI: "<<PI<<endl;return0;}
a.const常量必须在定义时初始化(因为后续无法修改)b.const常量有明确的类型(如int/double),编译器会做类型检查,而#define只是文本替换,无类型 c.const常量遵守作用域(比如局部const只在函数内生效),#define是全局生效(直到#undef)
2.核心难点: const 修饰指针
const修饰指针有三种常见场景,核心是区分"指向的内容不可改"和"指针本身不可改"
![]()
#include <iostream>usingnamespacestd;intmain(){inta=10,b=20;// 场景1:const int* p(指向常量的指针)constint*p1=&a;// *p1 = 100; // 错误:不能修改指向的内容p1=&b;// 正确:指针本身可以指向其他地址// 场景2:int* const p(常量指针)int*constp2=&a;*p2=100;// 正确:可以修改指向的内容// p2 = &b; // 错误:指针本身不能指向其他地址// 场景3:const int* const p(都只读)constint*constp3=&a;// *p3 = 100; // 错误// p3 = &b; // 错误cout<<"a: "<<a<<endl;// 输出:100return0;}
![]()
3.const 修饰函数参数
const修饰函数参数的核心目的是:"防止函数内部意外修改传入的参数, 尤其适合大对象(如字符串、类对象)结合引用使用"
#include <iostream>#include <string>usingnamespacestd;// const修饰普通参数(值传递):意义不大(因为参数是拷贝,修改不影响原变量)voidprintNum(constintnum){// num = 100; // 错误:不能修改const参数cout<<"Num: "<<num<<endl;}// const修饰引用参数(重点):避免拷贝+防止修改原对象voidprintStr(conststring&str){// str = "hello"; // 错误:不能修改const引用的内容cout<<"Str: "<<str<<endl;}intmain(){printNum(5);printStr("world");return0;}
4.const 修饰类成员函数
const放在类成员函数的末尾,表示:"该函数不会修改类的任何成员变量(除非成员变量被mutable修饰), 只能调用其他const成员函数"
#include <iostream>usingnamespacestd;classPerson{private:stringname;mutableintage;// mutable:即使在const函数中也能修改public:Person(stringn,inta):name(n),age(a){}// const成员函数:不能修改普通成员变量stringgetName()const{// name = "Tom"; // 错误:不能修改非mutable成员age=20;// 正确:mutable成员可以修改returnname;}// 普通成员函数:可以修改所有成员voidsetName(stringn){name=n;}};intmain(){constPersonp("Jerry",18);// const对象// p.setName("Bob"); // 错误:const对象只能调用const成员函数cout<<p.getName()<<endl;// 正确:调用const成员函数return0;}
5.const 修饰函数返回值
const修饰返回值的核心目的是:"防止返回值被意外修改, 常见于返回指针/引用的场景"
#include <iostream>usingnamespacestd;// 返回const int:防止返回值被修改(值传递意义不大)constintadd(inta,intb){returna+b;}intmain(){intres=add(3,5);// 正确:可以赋值给普通变量// add(3,5) = 10; // 错误:不能修改const返回值cout<<res<<endl;// 输出:8return0;}