您的当前位置:首页正文

C++入门基础知识155—【关于C++类成员访问运算符 -> 重载】

2024-11-26 来源:个人技术集锦

成长路上不孤单??????

【14后?///C++爱好者?///持续分享所学?///如有需要欢迎收藏转发///?】

今日分享关于C++类成员访问运算符 -> 重载的相关内容!

关于【C++ 类成员访问运算符 -> 重载】

一、什么是类成员访问运算符( ->)‌

类成员访问运算符‌是指在面向对象编程中用于访问类成员(如成员变量和成员函数)的运算符。在C++中,主要有两种形式的成员访问运算符:点运算符(.)和箭头运算符(->)。

二、类成员访问运算符( ->)的语法规则

三、类成员访问运算符( ->)的应用场景

  1. 访问对象的成员变量‌:例如,obj.x = 5; 使用点运算符访问对象的成员变量。
  2. 调用对象的成员函数‌:例如,obj.func(); 使用点运算符调用对象的成员函数。
  3. 访问对象指针的成员变量‌:例如,ptr->x = 5; 使用箭头运算符访问对象指针的成员变量。
  4. 调用对象指针的成员函数‌:例如,ptr->func(); 使用箭头运算符调用对象指针的成员函数‌。

四、类成员访问运算符( ->)示例代码

五、什么是类成员访问运算符( ->)重载

在C++中,通过重载成员函数来实现对类成员的访问。具体来说,通过重载->运算符,可以使得对象像指针一样访问其成员变量和成员函数。在C++中,可以通过定义一个成员函数来重载->运算符。这个成员函数的返回类型是一个指向类成员的指针。例如:

在这个例子中,Ptr类重载了->运算符,使得Ptr对象可以像指针一样访问X类的成员变量和成员函数‌1。

六、类成员访问运算符( ->)重载及示例代码

类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。

运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。比如,当指针销毁时,或者当指针指向另一个对象时,会自动删除对象。

间接引用运算符 -> 可被定义为一个一元后缀运算符。也就是说,给出一个类:

类 Ptr 的对象可用于访问类 X 的成员,使用方式与指针的用法十分相似。例如:

语句 p->m 被解释为 (p.operator->())->m。同样地,下面的实例演示了如何重载类成员访问运算符 ->。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

#include <iostream>

#include <vector>

using namespace std;

// 假设一个实际的类

class Obj {

   static int i, j;

public:

   void f() const { cout << i++ << endl; }

   void g() const { cout << j++ << endl; }

};

// 静态成员定义

int Obj::i = 10;

int Obj::j = 12;

// 为上面的类实现一个容器

class ObjContainer {

   vector<Obj*> a;

public:

   void add(Obj* obj)

   {

      a.push_back(obj);  // 调用向量的标准方法

   }

   friend class SmartPointer;

};

// 实现智能指针,用于访问类 Obj 的成员

class SmartPointer {

   ObjContainer oc;

   int index;

public:

   SmartPointer(ObjContainer& objc)

   {

       oc = objc;

       index = 0;

   }

   // 返回值表示列表结束

   bool operator++() // 前缀版本

   {

     if(index >= oc.a.size() - 1return false;

     if(oc.a[++index] == 0return false;

     return true;

   }

   bool operator++(int// 后缀版本

   {

      return operator++();

   }

   // 重载运算符 ->

   Obj* operator->() const

   {

     if(!oc.a[index])

     {

        cout << "Zero value";

        return (Obj*)0;

     }

     return oc.a[index];

   }

};

int main() {

   const int sz = 10;

   Obj o[sz];

   ObjContainer oc;

   for(int i = 0; i < sz; i++)

   {

       oc.add(&o[i]);

   }

   SmartPointer sp(oc); // 创建一个迭代器

   do {

      sp->f(); // 智能指针调用

      sp->g();

   while(sp++);

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

下面这一个具体的示例,展示的是如何使用重载的->运算符:

在这个示例中,Ptr类通过重载->运算符,使得Ptr对象可以像指针一样访问Obj对象的成员变量x‌。

显示全文