C++ 中 ->和 . 操作符的区别
C++ 中 ->
和 .
操作符的区别
在 C++ 中,->
(箭头操作符)和 .
(点操作符)都用于访问类或结构体的成员,但它们的使用场景和含义有重要区别。
核心区别
操作符 | 使用对象 | 含义 |
---|---|---|
. | 对象实例 | 直接访问对象的成员 |
-> | 对象指针 | 通过指针间接访问对象的成员 |
详细解释
1. 点操作符 (.)
点操作符用于直接访问对象实例的成员(包括数据成员和成员函数)。
#include <iostream>
#include <string>class Person {
public:std::string name;int age;void introduce() {std::cout << "Hello, I'm " << name << std::endl;}
};int main() {// 创建对象实例Person person;// 使用点操作符访问成员person.name = "Alice";person.age = 25;person.introduce(); // 输出: Hello, I'm Alicereturn 0;
}
2. 箭头操作符 (->)
箭头操作符用于通过指针访问对象的成员。它实际上是先解引用指针,然后访问成员的一种简写形式。
int main() {// 创建对象指针Person* personPtr = new Person();// 使用箭头操作符访问成员personPtr->name = "Bob";personPtr->age = 30;personPtr->introduce(); // 输出: Hello, I'm Bob// 箭头操作符等价于先解引用再使用点操作符(*personPtr).name = "Charlie";(*personPtr).introduce(); // 输出: Hello, I'm Charliedelete personPtr;return 0;
}
等价关系
pointer->member
完全等价于 (*pointer).member
。箭头操作符只是一种语法糖,让代码更简洁易读。
特殊情况:操作符重载
C++ 允许重载 ->
操作符,这使得它可以用于智能指针和其他类似指针的类。
#include <memory>int main() {// 使用智能指针std::unique_ptr<Person> smartPtr = std::make_unique<Person>();// 仍然使用箭头操作符访问成员smartPtr->name = "David";smartPtr->introduce(); // 输出: Hello, I'm Davidreturn 0;
}
使用场景总结
-
使用
.
当你有:- 对象实例(栈分配)
- 对象引用
- 解引用后的指针(如
(*ptr).member
)
-
使用
->
当你有:- 对象指针(原始指针或智能指针)
- 重载了
->
操作符的对象
常见错误
Person person;
Person* ptr = &person;// 正确用法
person.name; // 对象使用点
ptr->name; // 指针使用箭头
(*ptr).name; // 解引用后使用点// 错误用法
// person->name; // 错误:对象不能使用箭头
// ptr.name; // 错误:指针不能使用点
记忆技巧
- 如果你有一个实实在在的对象,使用点操作符 (.)
- 如果你有一个指向对象的指针,使用箭头操作符 (->)
- 箭头操作符可以看作是「先解引用,再访问」的简写形式
理解这两个操作符的区别对于正确使用 C++ 中的对象和指针至关重要,特别是在使用动态内存分配和智能指针时。