c++重载操作符研究之 operator ->()
来源:互联网 发布:java将object转为date 编辑:程序博客网 时间:2024/05/19 06:39
本章是介绍重载操作符 -> 的研究,上代码先
#include "stdafx.h"#include <iostream>#include <string>template<typename T>class A1 {public: A1(T* t) : m_imp(t) { std::cout << "A1()" << std::endl; } ~A1() { std::cout << __FUNCTION__ << std::endl; } T* operator ->() { std::cout << __FUNCTION__ << std::endl; return m_imp; }private: T* m_imp;};template<typename T>class A2 {public: A2(T* t) : m_imp(t) {} A1<T> operator ->() { std::cout << __FUNCTION__ << std::endl; A1<T> a(m_imp); return a; }private: T* m_imp;};template<typename T>class A3 {public: A3(T* t) : m_imp(t) {} A2<T> operator ->() { std::cout << __FUNCTION__ << std::endl; A2<T> a(m_imp); return a; }private: T* m_imp;};class Test {public: void show() { std::cout << m_a << std::endl; }private: int m_a;};template<typename T>class B1 {public: B1(T* t) : m_imp(t) { std::cout << __FUNCTION__ << std::endl; } B1(T& t) : m_imp(&t) { std::cout << __FUNCTION__ << std::endl; } T* operator->() { std::cout << __FUNCTION__ << std::endl; return m_imp; }private: T* m_imp;};int _tmain(int argc, _TCHAR* argv[]){ Test* pt = new Test(); A1<Test> a1(pt); a1->show(); a1.A1::operator ->()->show(); A2<Test> a2(pt); a2->show(); // 可自动推导出如下式 // a2.A2::operator ->().A1::operator ->()->show(); A3<Test> a3(pt); a3->show(); // 可自动推导出如下式 // a3.A3<Test>::operator ->().A2::operator ->().A1::operator ->()->show(); B1<Test> b1(pt); b1->show(); B1<B1<Test> > b2(b1); b2->operator ->()->show(); b2.B1<B1<Test> >::operator ->()->B1<Test>::operator ->()->show(); // b2->show(); 错误,不能递归推导return 0;}
基于以上代码,可以看出 对->运算符的重载,编译器无法进行递归推导.
这种递归推导,编译器可以在编译期处理,为什么编译器不处理这种递归推导,留待思考
以上代码在vc编译器测试通过。
- c++重载操作符研究之 operator ->()
- C++,重载输出操作符<<, cout.operator()
- 【C++】operator关键字(重载操作符)
- 重载->和*操作符之operator->()与operator*()
- operator 操作符重载
- 重载operator操作符
- C++库研究笔记——赋值操作符operator=的正确重载方式(三个准则)
- C++库研究笔记——赋值操作符operator=的正确重载方式(2)
- C++ 操作符重载 operator = 、operator <
- C++ 操作符重载 operator = 、operator <
- C++,重载输出操作符<<, cout.operator()是什么东东?
- C++ operator关键字(重载操作符)
- C++ operator关键字(重载操作符)
- operator C++ 操作符重载
- operator关键字(重载操作符)
- 重载操作符operator详解
- C++ 重载操作符 operator
- [C/C++]_[操作符重载operator type()和operator()的区别]
- epoll + 线程池 回应服务器(Linux) ---可以支持上万个连接
- 解决ubuntu中vi不能正常使用方向键与退格键的问题
- Oracle下载地址
- #pragma once与 #ifndef的区别
- TCP关闭连接(四次挥手)
- c++重载操作符研究之 operator ->()
- hibernate 注解字段默认值
- centos双网卡配置
- FatMouse' Trade
- 人人笔试题
- 文件系统和数据库系统的区别
- 研究 android apk安装卸载等 产生的 系统广播
- POJ Prime Test
- 不好好读书,将来连表都不认识