成长路上不孤单??????
【14后?///C++爱好者?///持续分享所学?///如有需要欢迎收藏转发///?】
今日分享关于C++类成员访问运算符 -> 重载的相关内容!
关于【C++ 类成员访问运算符 -> 重载】
一、什么是类成员访问运算符( ->)
类成员访问运算符是指在面向对象编程中用于访问类成员(如成员变量和成员函数)的运算符。在C++中,主要有两种形式的成员访问运算符:点运算符(.)和箭头运算符(->)。
二、类成员访问运算符( ->)的语法规则
三、类成员访问运算符( ->)的应用场景
- 访问对象的成员变量:例如,
obj.x = 5;
使用点运算符访问对象的成员变量。 - 调用对象的成员函数:例如,
obj.func();
使用点运算符调用对象的成员函数。 - 访问对象指针的成员变量:例如,
ptr->x = 5;
使用箭头运算符访问对象指针的成员变量。 - 调用对象指针的成员函数:例如,
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() - 1 ) return false ; if (oc.a[++index] == 0 ) return 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
。