c++ const的不同写法

本文详细解析了C语言中指针与const修饰符的四种不同组合方式及其含义,帮助读者理解如何正确地使用const来限定指针变量的行为。

const int *p; // const修饰的是*p,因此*p是常量不能改变,但可以改变p的指向;
int const* p; // 同上,主要是看const与*的前后关系;
int* const p; // const修饰的是p,因此p的指向是常量不能改变,但*p可以改变;
const int const *p; // 两个const既修饰了*p也修饰了p,因此*p与p都是常量不能改变;

注:以上是针对p使用的时候来说的,具体解释如下。

  • const *p // a=*p;如果a的值等于1,那么a就永远等与1,P代表的是地址,就是说这个地址是可以变化的,把内存分成1-10层楼房,那么1可以住在任何一间房子里面,就是说P是门牌号,可以变化,但是房子里面的内容不会变化

 

  • *const p // a=*p;如果a的值等于1,那么你可以重新赋值给*p=2,这个时候在a=*p,a就变成2了,就是说房子里面的内容可以变,但是门牌号不会变
<think>好的,用户想了解C++const关键字的用法和示例。我需要根据提供的引用资料来整理回答。首先,看看引用里提到的内容: 引用[1]提到constexpr和const的区别,但用户主要关注const,所以可能需要简要提到两者的区别。引用[2]和[3]有具体的代码示例,比如const指针的不同写法,以及函数参数和返回类型的const用法。引用[4]则涉及成员函数后的const和修饰返回类型的情况。 需要分点说明const不同用法,每个用法配上示例。比如修饰变量、指针、函数参数、返回值、成员函数、类对象等。注意示例代码的正确性,比如引用[2]中的指针声明方式是否正确。例如,int const* const p是否合法,以及和const int* const p的区别,其实两者是等价的,只是写法不同。 还要注意用户可能对指针的const位置容易混淆,需要明确说明顶层const和底层const的区别。例如,const int* p是底层const,指针指向的内容不可变;int* const p是顶层const,指针本身不可变。 另外,成员函数后的const表示该函数不会修改类的成员变量,如引用[4]中的getValue() const。需要解释这种用法,并给出例子。 可能还需要提到const在函数参数中的使用,比如传递const引用以避免拷贝,同时防止修改原始数据,如void func(const std::string& str)。 需要确保每个示例符合LaTeX格式,用户要求行内数学表达式用$...$,但代码部分应该用代码块,所以示例中的代码需要用正确的语法,比如使用反引号包裹代码块。 检查是否有遗漏的用法,比如const修饰类的成员变量,或者在常量表达式中的应用,如引用[4]提到的修饰常量表达式,但可能这部分需要结合constexpr,不过用户的问题集中在const,所以可能只需简要提及。 最后,生成相关问题,可能需要涵盖constconstexpr的区别,const不同上下文中的影响,常见错误用法等。 总结回答结构: 1. 修饰变量 2. 修饰指针(顶层和底层) 3. 函数参数中的const 4. 修饰函数返回值 5. 修饰成员函数(const成员函数) 6. 修饰类对象 7. 与constexpr的区别(简要) 每个部分配示例代码和相关引用标注。 确保示例代码正确,比如引用[2]中的代码可能存在HTML转义问题,需要转换为正确的符号,如&转为&,<转为<等。例如,int const * const p=&a;应改为int const * const p = &a;。 同时,注意引用标注的位置,在相关段落末尾自然添加,如[^2],[^3]等。 最后,生成的相关问题需要围绕const不同用法、常见错误、优化场景等。</think>### C++ `const` 关键字用法详解 `const` 是 C++ 中用于定义常量的关键字,能够增强代码的可读性和安全性。以下是其核心用法及示例: --- #### 1. **修饰变量:声明不可修改的常量** - **语法**:`const 类型 变量名 = 值;` 或 `类型 const 变量名 = 值;` - **示例**: ```cpp const int MAX_SIZE = 100; // 声明常量 int const MIN_VALUE = 0; // 等价写法 // MAX_SIZE = 200; // 错误:常量不可修改[^2] ``` --- #### 2. **修饰指针:区分顶层 `const` 和底层 `const`** - **顶层 `const`**:指针本身不可变。 - **底层 `const`**:指针指向的值不可变。 - **示例**: ```cpp int a = 10; const int* p1 = &a; // 底层const:指向的值不可变 int* const p2 = &a; // 顶层const:指针本身不可变 const int* const p3 = &a;// 双重const:指针和值均不可变 ``` --- #### 3. **修饰函数参数:防止意外修改** - 用于传递只读参数(如对象、指针或引用)。 - **示例**: ```cpp void printValue(const std::string& str) { // str[0] = 'A'; // 错误:str 是常量引用 std::cout << str; } ``` --- #### 4. **修饰函数返回值:禁止修改返回值** - 常用于返回指针或引用时,确保返回值不被修改。 - **示例**: ```cpp class MyClass { public: const int& getValue() const { return value; } private: int value = 10; }; // const int& val = obj.getValue(); // val = 20; // 错误:返回值不可修改[^4] ``` --- #### 5. **修饰成员函数:承诺不修改对象状态** - 在成员函数末尾添加 `const`,表示该函数不会修改成员变量。 - **示例**: ```cpp class Data { public: int read() const { // count++; // 错误:const 函数不能修改成员变量 return value; } private: int value = 42; mutable int count = 0; // 允许在const函数中修改 }; ``` --- #### 6. **修饰类对象:限制调用非 `const` 成员函数** - `const` 对象只能调用 `const` 成员函数。 - **示例**: ```cpp const Data data; int result = data.read(); // 正确:调用 const 函数 // data.modify(); // 错误:非 const 函数不可调用 ``` --- #### 7. **与 `constexpr` 的区别** - `const` 表示运行时常量,`constexpr` 表示编译时常量。 - **示例**: ```cpp constexpr int ARRAY_SIZE = 100; // 编译时确定 const int size = getSize(); // 运行时确定[^1] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值