在 C++ 中,-> 和 . 都可以用于访问类的成员变量和成员函数。但它们在使用上有一些区别:
1. 对于指针类型的对象,必须使用 -> 来访问其成员;而对于非指针类型的对象,则需要使用 . 。
2. -> 运算符在实际使用时会先对指针进行解引用操作 (*p),然后再访问指针所指向对象的成员;而点运算符则是直接访问对象的成员。
例如,假设有一个名为 p 的指向某个对象的指针,该对象拥有一个名为 memVar 的成员变量和一个名为 memFunc 的成员函数,那么访问这些成员的方式如下:
- p->memVar; // 访问 p 所指向对象的 memVar 成员变量
- p->memFunc(); // 访问 p 所指向对象的 memFunc 成员函数
-
- (*p).memVar; // 与上面等效
- (*p).memFunc(); // 与上面等效
-
- obj.memVar; // obj 是某个类的对象,访问该对象的 memVar 成员变量
- obj.memFunc(); // 访问 obj 对象的 memFunc 成员函数
需要注意的是,在使用 -> 访问成员时,其左侧应当是一个指向对象的指针。否则会导致编译错误。
示例
- #include
- class Myclass {
- public:
- int number = 2;
- };
-
- int main() {
- Myclass a;
- std::cout << "a.number = " << a.number << std::endl;
- Myclass* b = &a;
- std::cout << "(*b).number = " << (*b).number << std::endl;
- std::cout << "b->number = " << b->number << std::endl;
- }
-
输出结果:
a.number = 2
(*b).number = 2
b->number = 2
分析:
这段代码创建了一个名为 Myclass
的类,其中包含一个公有成员变量 number,
其 number
成员变量的值设置为 2。在 main
函数中,首先创建了一个 Myclass
类的实例 a,通过a.number访问number成员变量
。然后,创建了一个指向 a
的指针 b
,使用 (*b).number
和 b->number
分别访问了 number
成员变量,并进行打印输出。
在 C++ 中,结构体和类的使用方式是相似的。对于结构体,也可以使用 -> 和 . 来访问其成员变量和成员函数,但它们的区别与前面提到的指针和非指针类型的对象的区别是一样的。
当使用指向结构体的指针时,需要使用 -> 运算符来访问成员;而对于结构体的实例(非指针类型),则需要使用 . 运算符。
例如,假设有一个名为 p 的指向结构体的指针,该结构体拥有一个成员变量 memVar 和一个成员函数 memFunc,那么访问这些成员的方式如下:
- p->memVar; // 访问 p 所指向结构体的 memVar 成员变量
- p->memFunc(); // 访问 p 所指向结构体的 memFunc 成员函数
-
- (*p).memVar; // 与上面等效
- (*p).memFunc(); // 与上面等效
-
- obj.memVar; // obj 是某个结构体的实例,访问该实例的 memVar 成员变量
- obj.memFunc(); // 访问 obj 实例的 memFunc 成员函数
需要注意的是,使用 -> 访问结构体成员时,左侧需要是一个指向结构体的指针。如果左侧不是指针类型或者是空指针,将导致编译错误。而使用 . 访问结构体成员时,左侧应当是一个结构体的实例。
示例
- #include
- struct people{
- int number = 10;
- char str = 'h';
- };
-
- int main() {
- people a; // 创建结构体实例
- std::cout << "a.number = " << a.number << std::endl;
- std::cout << "a.str = " << a.str << std::endl;
-
- people* b = &a; // 创建指向该实例的指针,该指针指向结构体实例a
- // std::cout << b.number << std::endl; // 编译报错
- // std::cout << b.str << std::endl; // 编译报错
- std::cout << "b->number = " << b->number << std::endl;
- std::cout << "b->str = " << b->str << std::endl;
- std::cout << "(*b).number = " << (*b).number << std::endl;
- std::cout << "(*b).str = " << (*b).str << std::endl;
-
- }
-
输出结果:
在上面的代码中,a是一个结构体实例,通过a.number、a.str,我们可以访问结构体实例a中的number、str成员变量。
b 是一个指向 people 类型的指针,它指向名为 a 的结构体实例。通过 (*b).number、b->number;
(*b).str、b->str
,我们可以访问结构体实例中名为 number、str的成员变量。