C++常指针与指向常对象指针的区别详解
C++中的指针修饰符 `const` 放置位置不同会导致完全不同的语义。区分“指向对象的常指针”与“指向常对象的指针”,关键在于理解谁被约束为只读:是指针本身的地址值,还是指针所指向的对象数据。
结果或目标
掌握 C++ 中两种特殊指针的定义语法、行为差异及在实际开发中的应用场景,确保代码逻辑符合预期且具备安全性。
准备条件
具备 C++ 基础语法知识,熟悉类(Class)、对象实例化及指针的基本操作。了解 `const` 关键字的基本含义。
真实操作顺序:理解核心概念
第1步:理解指向对象的常指针(Pointer to Object, Constant Pointer)
目的:确保指针变量一旦初始化后,其存储的地址值固定不变,始终指向同一个对象实例。
入口与动作:将 `const` 放在指针符号 `*` 的右侧。
重要参数/语法:
类名 * const 指针变量 = &对象;
关键特性:
- 指针本身不可变:指针的值(即内存地址)不能被改变。这意味着你不能让该指针去指向另一个对象。
- 对象内容可变:只要对象中的数据成员不是 `const` 类型,你完全可以通过该指针修改对象内部的成员变量值。
代码示例:
Time t1(10, 12, 15);
Time t2;
Time * const ptr1 = &t1;
// ptr1 = &t2; // 错误!编译报错:无法修改 const 指针的值
ptr1.hour = 11; // 正确:可以修改指向对象 t1 的数据成员
应用场景:常用于函数形参。当希望防止函数内部意外修改指针本身的指向(例如防止意外重新分配或指向其他无关对象),但不需要保护对象内容不被修改时使用。
第2步:理解指向常对象的指针(Pointer to Const Object)
目的:确保通过该指针访问时,不能修改其所指向的对象的任何数据,从而保护数据的只读属性。
入口与动作:将 `const` 放在指针符号 `*` 的左侧,通常放在类型声明之前。
重要参数/语法:
const 类名 * 指针名 = &对象;
关键特性:
- 对象内容不可通过指针修改:即使原对象是非 `const` 的,一旦通过此指针访问,也不能修改其成员变量。
- 指针本身可变:指针变量的值可以改变,即它可以重新指向另一个同类型的对象。
- 指向限制:常对象只能由指向常对象的指针指向。非 `const` 对象可以由它指向,但此时被视为只读。
代码示例:
// 定义常变量
const int a = 5;
const int *p = &a;
// p = &a2; // 假设 a2 存在,这是合法的,指针可以改变指向
// *p = 6; // 错误!不能通过指针修改常量的值
class Time {
public:
int hour, minute, second;
};
const Time t1;
const Time *p = &t1;
p->hour = 10; // 错误!试图通过指向常对象的指针修改内容
应用场景:最常用于函数形参,目的是保护传入的对象数据不被函数意外修改。这是编写安全 API 的最佳实践。
第3步:对比辨析易混点
初学者最容易混淆这两者的定义顺序和实际权限。请记住一个简单的口诀:
`*` 右边是 `const`,指的是指针常量(指针本身不可变);
`*` 左边是 `const`,指的是指向常量的指针(所指内容不可变)。
具体对比如下表所示:
第4步:综合验证与常见误区排错
误区1:认为常对象可以由普通指针指向。
事实:常对象只能由指向常对象的指针指向。若尝试用 `Time *p = &t1;`(其中 t1 是 const Time)编译会报错,因为存在从 `const` 到非 `const` 的降级风险。
误区2:忽略初始化要求。
对于“指向对象的常指针”(`T * const`),必须在定义时进行初始化。因为其值不可变,若不初始化则无有效地址可用,导致编译错误。
混合情况:如果写成 `const T * const p`,则表示既不能修改指针本身,也不能通过指针修改对象内容。这是最严格的指针类型。
完成判断
当你能够准确写出这两种指针的定义,并解释清楚为何 `ptr=&obj2` 对其中一种合法而另一种非法,以及为何 `*ptr=value` 对其中一种合法而另一种非法时,即标志着已掌握该知识点。
简要总结
在 C++ 开发中,正确使用 `const` 修饰指针是提高代码健壮性的关键。
- Time * const p:p 是常量,只能指向一个固定的对象,但可以修改该对象的内容。
- const Time * p:p 指向的内容是常量,不能通过 p 修改对象内容,但 p 可以指向其他对象。
以上就是C++中指向对象的常指针与指向常对象的指针的详细讲解,更多关于C++指针用法的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









