成员访问控制符重载

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

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

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

class Ptr
{//X * operator->();
}

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

void f(Ptr p)
{p -> m = 10; // (p.operator ->()) ->m = 10;
}

语句p -> m 被解释为(p.operator ->()) ->m = 10;

/***
membervis.cpp
***/
#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;
};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;
}

运行结果:

exbot@ubuntu:~/wangqinghe/C++/20190812$ g++ membervis.cpp -o membervis

exbot@ubuntu:~/wangqinghe/C++/20190812$ ./membervis

10

12

11

13

12

14

13

15

14

16

15

17

16

18

17

19

18

20

19

21

转载于:https://www.cnblogs.com/wanghao-boke/p/11337850.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++动态内存

C程序中内存分为两个部分 栈&#xff1a;在函数内部声明的所有变量都将占用栈内存。 堆&#xff1a;这是程序中未使用的内存&#xff0c;在程序中可用于动态分配内存。 在很多时候&#xff0c;我们无法提前预知需要多少内存来存储某个变量的特定信息&#xff0c;所需内存的大小…

文件和流

iostream标准库提供了cin和cout方法用于标准输入读取流和向标准输出写入流。 从文件读取流和向文件写入流&#xff0c;需要用到fstream库。它定了三个数据类型 数据类型 描述 ofstream 该数据类型表示输出文件流&#xff0c;用于创建文件并向文件写入信息 ifstream 该数据…

C++预处理器

预处理器是一些指令&#xff0c;指示表一起在实际编译之前所需要完成的预处理。 所有的预处理器指令都是以井号(#)开头&#xff0c;只有空格字符可以出现在预指令处理之前。预处理指令不是C语句&#xff0c;所以他们不会以分号(;)结尾。 #define预处理 #define预处理指令用于创…

C++信号处理

信号是由操作系统传给进程的中断&#xff0c;会提早终止一个程序。在UNIX、LINUX、Mac OS或windows系统上&#xff0c;可以通过按Ctrlc产生中断。有些信号不能被程序捕获&#xff0c;但是下表所列信号可以在程序中被捕获&#xff0c;并可以基于信号采取适当的动作。这些信号是定…

Python—“helloworld”

接触一门计算机新语言&#xff0c;第一件事就是要准备好一个编译器用来打代码。 网上很多环境搭建的方法&#xff0c;具体参照https://www.runoob.com/python/python-install.html 由于我之前一直在使用Ubuntu的gcc编译&#xff0c;恰好也可以运行python程序&#xff0c;我也就…

创建线程

pthread_self函数 获取线程ID。其作用对应进程中 getpid() 函数。 pthread_t pthread_self(void); 返回值&#xff1a;成功&#xff1a;0&#xff1b; 失败&#xff1a;无&#xff01; 线程ID&#xff1a;pthread_t类型&#xff0c;本质&#xff1a;在Linux下为无符号…

C/C++头文件

C/C头文件一览C、传统 C#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <fstream.h> //文件输入&#xff0f;输出#include <iomanip.h> //参数化…

Python变量类型

变量存储在内存中的值&#xff0c;这就意味着在创建变量时会在内存开辟一个空间。 基于变量的数据类型&#xff0c;解析器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 因此变量可以指定不同的数据类型&#xff0c;这些变量可以存储整数、小数、或字符。 变量…

线程退出

pthread_exit函数 将单个线程退出 void pthread_exit(void *retval); 参数&#xff1a;retval表示线程退出状态&#xff0c;通常传NULL 思考&#xff1a;使用exit将指定线程退出&#xff0c;可以吗&#xff1f; …

线程分离

pthread_detach函数 实现线程分离 int pthread_detach(pthread_t thread); 成功&#xff1a;0&#xff1b;失败&#xff1a;错误号 线程分离状态&#xff1a;指定该状态&#xff0c;线程主动与主控线程断开关系。线程结束后&#xff0c;其退出状态不由其他线程获取&#x…

线程知识点

控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_cancel getpid pthread_self 命名空间 线程属性 本节作为指引性介绍&…

读写锁

读写锁 与互斥量类似&#xff0c;但读写锁允许更高的并行性。其特性为&#xff1a;写独占&#xff0c;读共享。 读写锁状态&#xff1a; 一把读写锁具备三种状态&#xff1a; 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态 读写锁特性&#xff1a; 读…

条件变量

条件变量&#xff1a; 条件变量本身不是锁&#xff01;但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。 主要应用函数&#xff1a; pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数 pthread_c…

文件锁

借助 fcntl函数来实现锁机制。 操作文件的进程没有获得锁时&#xff0c;可以打开&#xff0c;但无法执行read、write操作。 fcntl函数&#xff1a; 获取、设置文件访问控制属性。 int fcntl(int fd, int cmd, ... /* arg */ ); 参2&#xff1a; F_SETLK (struct flock *) 设置…

进程间同步

互斥量mutex 进程间也可以使用互斥锁&#xff0c;来达到同步的目的。但应在pthread_mutex_init初始化之前&#xff0c;修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。 主要应用函数&#xff1a; pthread_mutexattr_t mattr 类型&#xff1a; 用于定义…

Python3字符串

字符串是Python中最常用的数据类型&#xff0c;可以使用单引号或双引号来创建字符串 创建字符串很简单&#xff0c;为变量分配一个值即可。 val1 ‘hello world’ var2 “Runoob” Python访问字符串的值 Python不支持单字符类型&#xff0c;单字符在Python中也是作为 一个字符…

服务器客户端编程

server 下面通过最简单的客户端/服务器程序的实例来学习socket API。 server.c的作用是从客户端读字符&#xff0c;然后将每个字符转换为大写并回送给客户端。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #incl…

Python3元组

Python的元组与列表相似&#xff0c;不同之处在于元组的元素不能修改 元组使用小括号&#xff0c;列表使用方括号 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 创建空元组 tup1 (); tup2 (1,) 元组只包含一个元素时&#xff0c;需要在…

Python3字典

字典是另一种可变容器模型&#xff0c;可存储任意类型的对象。 字典的每个键值(key>value)对用冒号分隔&#xff0c;每个对之间用逗号分隔&#xff0c;整个字典包括在花括号里&#xff0c;格式如下 d {key1 : value,key2 : value2} 键必须是唯一&#xff0c;但值则不必。 值…

线程回收

pthread_join函数 阻塞等待线程退出&#xff0c;获取线程退出状态 其作用&#xff0c;对应进程中 waitpid() 函数。 int pthread_join(pthread_t thread, void **retval); 成功&#xff1a;0&#xff1b;失败&#xff1a;错误号 参数&#xff1a;thread&#xff1a;线…