一句话说清 const pointer const data

本文详细解析了C/C++中const修饰符与指针结合的不同方式及其含义,帮助读者理解如何正确使用const来定义只读或不可修改的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const 语法虽然变化多端, 但并不是莫测高深, 如果关键字const 出现在星号左侧, 表示被指物是常量;如果出现在星号右侧, 表示指针自身是常量; 如果出现在星号两侧,表示被指物和指针都是常量。如果被指物是常量,有的人会把const写在类型之前, 有的人会写在类型之后, 星号之前, 这两种写法是等价的。

  const char * T 

         char const * T

         以上两种方法是等价的。

### C++ 中 `const` 成员函数 `T* data()` 的声明和用法 在 C++ 中,当定义个返回指针类型的常量成员函数时,该函数承诺不会修改对象的状态。对于 `T* data()` 函数而言,如果希望此方法能够被调用于常量对象,则需将其标记为 `const`。 #### 声明 为了使 `data()` 方法成为只读访问器并允许其由常量实例调用,应该如下所示声明: ```cpp class Example { public: T* data(); // 非 const 版本 const T* data() const; // const 版本 private: T* m_data; }; ``` 这里有两个重载版本的 `data()` :个是普通的可变版本;另个是带有 `const` 后缀的方法签名,表明它适用于常量对象并且不改变任何成员变量[^1]。 #### 定义 接下来展示如何实现这两个不同的 `data()` 实现方式: ```cpp // Non-const version implementation T* Example::data() { return m_data; } // Const version implementation which returns a pointer to constant type const T* Example::data() const { return m_data; } ``` 注意,在第二个例子中,不仅方法本身被标注为 `const` ,而且返回类型也变成了指向不可变更数据 (`const T`) 的指针,这确保了即使通过这个接口也无法更改底层的数据结构[^2]。 #### 使用场景 考虑下面的例子来理解这两种形式的实际应用差异: ```cpp Example ex; const Example cex; // 能够成功编译运行 auto ptr1 = ex.data(); ptr1->modifySomething(); // 编译错误:尝试经由 const 对象获取非常数指针 auto ptr2 = cex.data(); // 正确做法——从 const 对象获得 const 指针 const auto& cref_ptr = cex.data(); cref_ptr->readOnlyAccess(); ``` 上述代码片段明了为什么区分两种不同情况下的 `data()` 是重要的:当我们处理的是非恒定的对象时,我们可以得到可以用来修改目标资源的指针;而如果我们面对的是恒定对象,则我们仅能取得不允许进步操作这些资源的引用或指针[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值