声明指向对象的指针用 t ptr; 语法,如 myclass ptr;;未初始化时为野指针,不可解引用;需显式初始化为栈对象地址或 new 分配的堆地址;推荐用 std::unique_ptr 管理。

如何声明一个指向对象的指针
直接用 T* 语法,其中 T 是类名。不需要额外关键字或修饰——和声明指向基本类型的指针完全一样。
-
MyClass* ptr;声明了一个未初始化的指针,此时ptr的值是随机的,**不能解引用** - 必须显式初始化:比如
MyClass obj; MyClass* ptr = &obj;(指向栈对象) - 或动态分配:
MyClass* ptr = new MyClass();(指向堆对象,记得配对delete ptr;) - 现代 C++ 更推荐用
std::unique_ptr<myclass></myclass>替代裸指针,避免手动管理
为什么不能用 auto 推导时省略 *
auto ptr = &obj; 是合法的,但 auto ptr = obj; 得到的是对象副本,不是指针。编译器不会“猜”你要指针。
-
auto ptr1 = &obj;→ 推导为MyClass* -
auto ptr2 = obj;→ 推导为MyClass(复制构造) -
auto* ptr3 = &obj;显式要求推导指针类型,更安全、意图更清晰 - 漏掉
*是常见拼写错误,会导致意外拷贝,尤其在传参或循环中容易放大性能问题
访问成员时用 -> 还是 .
指针必须用 -> 访问成员;如果误用 .,编译器会报错,提示 “MyClass* has no member named ...”。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
ptr->func()✅ 正确 -
ptr.func()❌ 编译失败 -
(*ptr).func()等价于ptr->func(),但冗余,仅在重载operator->时才需考虑 - 智能指针如
std::shared_ptr同样支持->,行为一致
nullptr 初始化比野指针更安全
未初始化的指针内容不可预测,解引用必崩溃;而 nullptr 是确定的空值,可安全判空。
-
MyClass* ptr = nullptr;→ 明确表示“暂无对象” -
if (ptr) { ptr->do_something(); }可靠判断 -
MyClass* ptr;(无初始化)→ 值随机,if (ptr)可能为真也可能为假,行为未定义 - 类成员指针默认不初始化,务必在构造函数初始化列表中设为
nullptr
实际写代码时,最容易被忽略的是:栈对象生命周期结束之后,指向它的指针立刻失效,但编译器不报错,运行时踩内存才暴露——这种悬垂指针比空指针更难调试。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










