C++基础——操作符重载

关于操作符重载,是C++一个十分强大的功能。

本文初略介绍下,涉及到友元以及函数重载

头文件MyClass.h:

#ifndef MYCLASS_H_
#define MYCLASS_H_
#include <iostream>
#include <string>
using namespace std;
class MyClass
{
	friend ostream& operator<<(ostream& os,MyClass& c);
	friend MyClass operator*(const int& n,MyClass& c);
public:
	MyClass(int n1=1,int n2=1,int n3=1,string="NoName");
	virtual~MyClass();//虽然说virtual在此无意义,但那时建议养成好的习惯
	void Show()const;
	MyClass operator*(const int& n);
	void operator*=(const int& n);
private:
	string m_strName;//名称
	int m_nNum1;//记录数据1
	int m_nNum2;//记录数据2
	int m_nNum3;//记录数据3

};
MyClass::MyClass(int n1, int n2, int n3 , std::string )
:m_nNum1(n1),m_nNum2(n2),m_nNum3(n3)
{
	cout<<"通知:构造函数调用了"<<endl;
}
MyClass::~MyClass()
{
	cout<<"通知:调用析构函数"<<endl;
}
void MyClass::Show()const
{
	cout<<"当前对象名称为:"<<m_strName<<endl;
	cout<<"三个数据依次为:"<<endl;
	cout<<m_nNum1<<"  "<<m_nNum2<<"  "<<m_nNum3<<endl;
}
MyClass MyClass::operator *(const int& n)
{
	MyClass temp;
	temp.m_strName=this->m_strName;
	temp.m_nNum1=this->m_nNum1*n;
	temp.m_nNum2=this->m_nNum2*n;
	temp.m_nNum3=this->m_nNum3*n;
	return temp;
}
ostream& operator<<(ostream& os,MyClass& c)
{
	c.Show();
//	os<<c.m_nNum1<<endl;由于是友元,在此直接调用类私有成员也没有错误
	return os;
}
MyClass operator*(const int& n,MyClass& c)
{
	return c*n;
}
void MyClass::operator *=(const int& n)
{
	*this=(*this)*n;
}
#endif;

主函数:

// 关于重载.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include "MyClass.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	//提出问题--》分析问题--》解决问题
	MyClass c;
	/*cout<<c<<endl;没用重载操作符时,报错,
	因为<<操作符不认识右边的数据c,无法格式化输出
	于是,开始重载:让<<认识MyClass类
	由于<<的左边是cout即ostream对象,重载函数不能作为类成员函数
	于是,需要用到友元,让类外的函数也能访问类成员*/
	//重载完成后,再次使用:
	cout<<c<<endl;//顺利输出
	/*接下来提出另一个问题:如果我要将MyClass类的三个int成员变量直接扩大N倍怎么办呢?
	写一个类成员函数对这些变量进行修改是一个基本的方法,但是用重载更加简单灵活
	会遇到两种形式:MyClass*N和N*MyClass
	其实只要重载一次就可以了,另外一个直接return 这一个的函数就行*/
//	c=4*c;
//	cout<<c<<endl;
	//c*=4;//直接报错,继续重载
	c*=4;
	cout<<c;
	return 0;
}


代码中的注释很清楚了,不罗嗦了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值