关闭

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

标签: c++stringn2osc
573人阅读 评论(0) 收藏 举报
分类:

关于操作符重载,是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;
}


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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:580443次
    • 积分:6191
    • 等级:
    • 排名:第4007名
    • 原创:104篇
    • 转载:53篇
    • 译文:0篇
    • 评论:168条
    打赏
    微信扫码
    最新评论