C++运算符重载简单练习 写一个Integer包装类

// Operator.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace  std;
class Integer
{
public:
	//explicit如果添加explicit就不能进行隐式构造
	//隐式构造不会导致拷贝构造函数调用
	Integer(int num):m_num(num)
	{

	}
	//覆盖了拷贝构造函数就必须对拷贝对象的成员进行值赋值 有必要的时候还要进行深层拷贝比如重新分配内存
	Integer(const Integer&integer)
	{
	   m_num=integer.m_num;
	   cout<<"CPY CONSTRUCTION FUNCTION CALLED"<<endl;
	}
	//后缀形式
	//如果后缀形式那么形参会是0
	void operator++(int i)
	{
		this->m_num=m_num+1;
	}
	//前缀形式
	void operator++()
	{
		this->m_num++;
	}
	//前置--
	void operator--()
	{
		this->m_num--;
	}
	//后缀形式
	void operator--(int i)
	{
		this->m_num=m_num-1;
	}
	//重载+ 如果接受的不是  Integer&integerRef那么依然会触发拷贝构造函数
	Integer operator+(Integer &integerRef)
	{
		return Integer(m_num+integerRef.m_num);
	}
	Integer operator+(int i)
	{
		 return m_num+i;
	}
	Integer operator-(int i)
	{
		return m_num-i;
	}
	//重载=
	void operator=(int i)
	{
		m_num=i;
	}
	//重载+= -=
	void operator+=(int i)
	{
          m_num+=i;
	}
	void operator-=(int i)
	{
		m_num-=i;
	}
	//返回值
	int  ToVal()
	{
		return m_num;
	}
	//函数返回  赋值会导致拷贝构造调用
	Integer GetObj()
	{
		return *this;
	}
	//转换成字符串
	const string ToString()
	{
		char buf[10]="";
        _itoa_s(m_num,buf,10);
		return string(buf) ;
	}
	//COPY MYSELF
	//只有返回新的对象 或者创建新的对象通过其他对象初始化的时候 才会触发拷贝构造  或者函数体内部创建一个对象并且把对象作为返回值 才会触发 拷贝构造函数调用
	//如果return  Integer(m_num);是不会触发拷贝构造的
	//仿函数
	Integer operator()()
	{
       return *this;
	}
	//重载  对于ios流类库的 标准输入 标准输出 标准错误输出  所以我们只能声明<< >>插入提取运算符为 友元函数
	friend istream& operator >>(istream&is,Integer&intObj);
	friend ostream& operator <<(ostream&os,Integer&intObj);
	//从对象提取数据到变量 << >>运算符重载
	void operator>>(int &i)
	{
		i=m_num;
	}
	//输出到对象
	void operator<<(int i)
	{
		m_num=i;
	}
private:
	int m_num;
protected:
};
//重载IO
istream& operator >>(istream&is,Integer&intObj)
{
	 is>>intObj.m_num;
	 return is;
}
ostream& operator <<(ostream&os,Integer&intObj)
{
	os<<intObj.m_num ;
	return os;
}
int _tmain(int argc, _TCHAR* argv[])
{
	//implicit
	Integer integerObj1=1;
	Integer integerObj2=2;
	//integerObj1=integerObj2; 不会触发拷贝构造函数  Integer obj=integerObj1 才会触发拷贝构造调用
	//相当于integerObj++0
	integerObj1++;
	//相当于++x
	++integerObj1;
	cout<<"integerObj1="<<integerObj1.ToVal()<<endl;
	Integer intObjCmb=integerObj1+integerObj2;
	cout<<"intObjCmb="<<intObjCmb.ToVal()<<endl;
	Integer w=integerObj1;
	cout<<"w="<<w.ToString()<<endl;
	w+=2 ;
	cout<<"w+2="<<w.ToString()<<endl;
	cout<<"Copy W="<<w().ToString()<<endl;
	//重载标准输入和输出.....
	w=125;
	cout<<"W="<<w<<endl;
	int i;
	w>>i ;
	cout<<"i=w="<<w<<endl ;
	w<<1000;
	cout<<"w="<<w<<endl ;
	w>>i ;
	cout<<"i=w="<<w<<endl ;
	return 0;
}

时间: 2024-11-06 14:00:41

C++运算符重载简单练习 写一个Integer包装类的相关文章

VC++之运算符重载简单小结

封装继承和多态是面向对象三大基本支柱.在面向对象系统中有两种编译方式:静态联编和动态联编静态联编:也叫早期联编:指系统在编译时就决定如何实现某一动作,提供了执行速度快的优点.动态联编:也叫滞后联编:指系统运行时动态实现某一动作,它提供了灵活和高度问题抽象的优点.C++ 支持两种多态性:编译时的多态性和运行时的多态性. 编译时的多态性通过重载来获得,而重载有包含函数重载和运算符重载. 运行时的多态性通过使用继承和虚函数来获得. ===================================

新标准C++程序设计读书笔记_运算符重载

形式 返回值类型 operator 运算符(形参表) { …… } 运算符重载 (1)运算符重载的实质是函数重载(2)可以重载为普通函数,也可以重载为成员函数 1 class Complex 2 { 3 public: 4 double real,imag; 5 Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i) { } 6 Complex operator-(const Complex & c); 7 }; 8 9 Complex

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

【c++笔记十】运算符重载

2015年2月1日 阴雨 周日 今天难得休息,闲来无事就往岳麓山走了一遭,作为一个有情怀的程序猿就应该培养B格,不对,培养情操.拍了点雾凇,可以去我QQ空间看看. 今天笔记里要说的内容是:运算符重载.就像函数重载,运算符也可以重载.到底是什么样的重载呢?请听下回分解.哦不对,请看下面分解. --------------------------------------分割线------------------------------------------ 一.什么是运算符的重载? 我们先一起来看

Swift教程之运算符重载

原文地址:http://www.raywenderlich.com/80818/operator-overloading-in-swift-tutorial 作者:Corinne Krych  译者:孟祥月 blog:http://blog.csdn.net/mengxiangyue 这篇文章是本人第一次翻译,难免有错误,翻译的时候使用的是txt,所以格式上面有些不太好. 在早前的IOS 8盛宴系列的教程里,你已经了解到,Swift提供了许多强大的.现代的编程特性,比如泛型.函数式编程.一等类型

C++学习笔记之运算符重载

一.运算符重载基本知识 在前面的一篇博文 C++学习笔记之模板(1)——从函数重载到函数模板 中,介绍了函数重载的概念,定义及用法,函数重载(也被称之为函数多态)就是使用户能够定义多个名称相同但特征标(参数列表)不同的函数,目的是在对不同类型的参数执行相同的操作时只用一个同名的函数. 运算符重载,就是使同一个运算符在面临不同类型的数据时作出不同的操作(函数重载是操作相同),就是让同一个运算符有多重功能.实际上我们经常用的许多运算符已被重载,例如,将*用于地址,将得到存储在这个地址中的值:但将它用

二元运算符重载

------------------siwuxie095 二元运算符重载 所谓 二元运算符,即 这个符号与两个操作数进行运算 (1)加号 + 的重载 加号 + 的重载方式有两种:一种是友元函数重载,一种是成员函数重载 1)先来看成员函数重载,如下: 定义一个坐标类:Coordinate 在类中声明成员函数 operator+(),它的参数是 const Coordinate &coor 在实现时: 首先需要定义一个临时对象 temp,传入对象 coor 的 m_iX 要和 当前对象的 m_iX

从无到有写一个运维APP(三)完结篇

前言:自己的挖的坑还得填,此篇为完结篇,环境的搭建参考第一篇从无到有写一个运维APP(一),至于第二篇就跳过吧,写个APP没那么复杂.由于自己现在无业游民,所以没有什么现成的环境,环境就随便找个公网的..再者当下的完成度应该算不上一个完整的APP,但是作为参考,依瓢画葫芦绝对足够了,如果等完整产品,可能得等一段时间了,下面的是该项目的地址. 项目地址: https://github.com/youerning/MyApp(star一下呗) 效果图如下 文章目录: 准备工作 代理 页面框架 获取数

[转]C++之运算符重载(2)

上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又是完全不同的(q前置运算符:先加1,再赋值:后置运算符:先赋值,再加1).那么要怎么重载它们,才可以有效的区分开来呢?今天我就来说说C++中是怎么处理前置运算符和后置运算符的重载的.以及介绍一下插入运算符(>>)和提取运算符(<<)的重载. 1.在C++里编译器是根据运算符重载函数参数