C++题目一道: 重载`->': 您真的懂成员访问运算符的重载吗?
原题目在这里: http://hi.baidu.com/shilyx/item/672736e14a14a90c64db003a
要求:
//给出类Test的定义和实现,使程序编译通过,
//并且main函数中的输出语句输出8个100。
#include <stdio.h> class Test
{
}; int main()
{
Test t(); printf("%d\n", *t.nData);
printf("%d\n", *t->nData);
printf("%d\n", *(*t).nData);
printf("%d\n", *(*t)->nData);
printf("%d\n", *(**t).nData);
printf("%d\n", *(**t)->nData);
printf("%d\n", *(***t).nData);
printf("%d\n", *(***t)->nData); return ;
}
看第一个 *t.nData, 很容易知道, nData应该为plublic成员变量, 定义为 int* nData;
再看第二个, *t->nData; 咦, t不是指针却使用了->指针运算符, 说明->是一个被重载了的运算符. 所以要重载->.
哇, 重载->, 是不是你从来没有做过这样的事情? 嗯, 我也没做过, +-*/我都会重载, 这个还真不会. 于是Google了一下,
在 StackOverflow 上面找到了答案 (http://stackoverflow.com/questions/8777845/overloading-member-access-operators-c)

指针运算符的重载不是那么好理解, 作者也举例说明了, 我就不说了, 记录一下而已. 以不至于那么生疏...
回到第三个 *t->nData; 于是重载->:
const Test* operator->() const {return this;}
第三个解决.
再来看第三个, 第四个, 从第三四个开始, 后面的都一样了:
第三个是 *(*t).nData; 和第一个差不多, 只是一个一个*解引用, 但结果依然是对象本身, 从小数点可以看出. 因为小数点操作符不可以被重载.
于是还有一个重载:
const Test& operator*() const {return *this;}
好了, 结束, 整个代码如下:
#include <stdio.h> class Test
{
//给出类Test的定义和实现,使程序编译通过,
//并且main函数中的输出语句输出8个100。
//
public:
Test(int n):
nData(&m_nData)
{
*nData = n;
} int* nData; const Test* operator->() const {return this;}
const Test& operator*() const {return *this;} private:
int m_nData;
}; int main()
{
Test t(); printf("%d\n", *t.nData);
printf("%d\n", *t->nData);
printf("%d\n", *(*t).nData);
printf("%d\n", *(*t)->nData);
printf("%d\n", *(**t).nData);
printf("%d\n", *(**t)->nData);
printf("%d\n", *(***t).nData);
printf("%d\n", *(***t)->nData); return ;
}
C++题目一道: 重载`->': 您真的懂成员访问运算符的重载吗?的更多相关文章
- 【转】C++对成员访问运算符->的重载
运算符->的重载比较特别,它只能是非静态的成员函数形式,而且没有参数. 1.如果返回值是一个原始指针,那么就将运算符的右操作数当作这个原始指针所指向类型的成员进行访问: 2.如果返回值是另一个类 ...
- C++派生类成员访问作用域,同名重载
#include <iostream> using namespace std; class CFatherSum //父类Sum { public: int m_iVar; //公用数据 ...
- c/c++ 重载运算符 关系,下标,递增减,成员访问的重载
重载运算符 关系,下标,递增减,成员访问的重载 为了演示关系,下标,递增减,成员访问的重载,创建了下面2个类. 1,类StrBlob重载了关系,下标运算符 2,类StrBlobPtr重载了递增,抵减, ...
- C++ 重载运算符和重载函数
C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是 ...
- C++解析七-重载运算符和重载函数
重载运算符和重载函数C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列 ...
- C++ 自增、自减运算符的重载和性能分析
01 ++.--运算符重载函数的格式 自增运算符和自减运算符是有前置和后置之分的,如: a++ // 后置自增运算符 ++a // 前置自增运算符 b-- // 后置自减运算符 --b // 前置自减 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 重载运算符和重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不 ...
- C# 主要运算符中的成员访问(?.)
在开发过程中,我遇到了一种null 条件成员访问的写法,开始不太理解,之后专门查了微软的官方文档,下面是具体内容: 三种成员访问的三种形式 (1)x.y:成员访问. (2)x?.y:null 条件 ...
- 你真的懂Redis的5种基本数据结构吗?
摘要: 你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看. 本文分享自华为云社区<你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看>,作者:李子捌. 一 ...
随机推荐
- JavaScript筛选出数组种连续的数字
function arrange(source) { var t; var ta; var r = []; for(var j=0;j<source.length;j++){ var v=sou ...
- python 读取单所有json数据写入mongodb(单个)
<--------------主函数-------------------> from pymongo import MongoClientfrom bson.objectid impor ...
- ZH奶酪:CSS中限制span显示字数
span中的文字是取出于数据库的,不确定文字的个数,由于排版的原因只想让span不超过6个字,如果超过只显示六个,当鼠标悬浮上去的时候tip显示全部内容 Step1.在span中添加title < ...
- Ubuntu Server无法安装busybox-initramfs
解决方法很简单,使用英文安装就好,可以参考这个帖子:http://forum.ubuntu.com.cn/viewtopic.php?f=77&t=471547&p=3137632
- windows安装python2.7后的注册(registry)问题
[提要]win平台上,python2.7官网的安装包在安装后不会添加环境变量且不会把安装信息写入注册表. 把python和pip的安装路径添加到环境变量是做python开发必要的一步,而写入注册表的原 ...
- CommonJS、AMD、CMD和ES6模块化区别
本文参考自:https://www.cnblogs.com/chenguangliang/p/5856701.html 1.CommonJS NodeJS是CommonJS规范的实现,webpack ...
- Shell与Bash
1:Shell编程的本质 Shell的意思是“壳程序”,它是一个视窗,供我们交互. 系统中有许多负责不同功能的可执行文件,他们被添加到PATH变量后,我们就可以在Shell中通过命令行调用.这些这些可 ...
- JavaBean与XML转换——XStream使用笔记
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6648131.html 一:View层与Control层的数据交互 做过Web项目的人都知道,当对一个requ ...
- 【HTML5 Canvas】计算元件/显示对象经过Matrix变换后在上级/舞台上的bounds(边界矩形rect)
如上图所示,这样的一个简单矩形,边界矩形是(x:-28, y:-35, width:152, height:128),这是在这个元件/显示对象自己的坐标空间的范围. 那么把这个放到父元件(舞台)中,再 ...
- 〖Linux〗Shell十进制数值转换十六进制
dec2hex(){ printf } a=$(dec2hex ) echo $a