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

原创 2012年03月21日 22:49:03

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


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

版权声明:本文为博主原创文章,未经博主允许不得转载。(博客地址:http://blog.csdn.net/mfcing)

所有C++操作符重载的例子

1.[ ]操作符重载 C++语言规定:“[ ]”只能作为类的成员函数进行重载。 “[ ]”是C++中的下标运算符,对于数组或指针来说,下表运算的语义是确定的,不能进行重载。因此,如果看到一个运算...
  • chijianxingfeng
  • chijianxingfeng
  • 2013年04月30日 13:04
  • 2450

C++ 重载操作符 operator

参数个数的限定     非成员函数:   单目运算符:参数表中只有一个参数;   双目运算符:参数表中只有两个参数       成员函数:   单目运算符:参数表中没有参数; ...
  • fenhong91
  • fenhong91
  • 2017年02月07日 09:55
  • 1031

c++ 逗号操作符重载

Overload Operator Comma 首先看看think in c++ 给出的一个重载的例子 #include using namespace std; class After { ...
  • x356982611
  • x356982611
  • 2016年04月05日 12:32
  • 1644

C++运算符重载(11) - 重载<<和>>操作符

运算符 “>”用于流输出。 在开始重载这些操作符之前,必须注意下面的事项: 1) cout是输出类的对象,而cin是输入类的对象 2) 这些操作符必须重载为全局函数。如果想要让它们可以访问私有成员,...
  • shltsh
  • shltsh
  • 2015年05月27日 00:11
  • 948

重载运算符不能对指针单独操作

因为系统已经定义了两个指针的运算,所以你不能改变它 比如两个同类型的指针相加,就是指针的指相加,你是不能改变这个行为的           #include ...
  • Sayesan
  • Sayesan
  • 2015年12月14日 11:16
  • 733

【C++基础】----操作符重载(03)

今天我们来讨论操作符重载中比较重要的一个内容:赋值操作符的重载 由于编译期对赋值有着严格的要求和限制,因此强制 operator=() 为成员函数。 成员函数的优点在于在调用时,永远有一个隐式的thi...
  • Batman_0331
  • Batman_0331
  • 2015年02月03日 20:39
  • 292

C++输入输出操作符重载

1. 输入输出操作符简介C++中输入操作符是>>,输出操作符是
  • K346K346
  • K346K346
  • 2015年11月18日 09:35
  • 1377

C++库研究笔记——赋值操作符operator=的正确重载方式(三个准则)

C++ Operator Overloading Guidelines 设计要求: a, b, c, d, e; a = b = c = d = e = 42; This is inter...
  • mathgeophysics
  • mathgeophysics
  • 2013年07月30日 11:00
  • 5443

C++学习笔记:为什么不要重载逻辑与和逻辑或&& || 操作符

理论知识: 1—&&和||是C++中非常特殊的操作符 2—&&和||内置实现了短路规则 3—操作符重载是靠函数重载来实现的 4—操作数作为函数参数传递 5—C++的函数参数都会被求值,无法实...
  • patkritLee
  • patkritLee
  • 2016年02月22日 15:09
  • 803

C++ 运算符流操作符重载和友元--笔记

/************************************************************************************************ *...
  • JarvisChu
  • JarvisChu
  • 2011年07月23日 20:57
  • 5619
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++基础——操作符重载
举报原因:
原因补充:

(最多只允许输入30个字)