关于操作符重载,是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;
}
代码中的注释很清楚了,不罗嗦了