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