操作符重载

类中使用操作符,希望明了易懂,可以通过重载操作符,使自定义类使用操作符像一般类使用一样简洁。如何自定义操作符?其实操作符的重载相当于函数的重载(代码中标注)。

下面以“+”的重载为例子。

#ifndef STUDENT_H
#define STUDENT_H

#include <iostream>
using namespace std;

class student
{
    public:
        student();
        student(int num, string name);
        void print();
        student operator+(const student& st);//重载+操作符,形参为const引用,系统不再调用复制构造函数,直接使用传入源参,提高效率。
        virtual ~student();
    protected:
    private:
        int     number;
        string  name;
};

#endif // STUDENT_H

#include "../include/student.h"
student::student()
{
    number = 0;
    name = "";
}
student::student(int num, string name)
{
    //ctor
    number       = num;
    this->name   = name;
}
void student::print()
{
    cout<<"number:" << number<<endl;
    cout<<"name:" << name<<endl;
    cout<<endl;
}
student student::operator+(const student& st)
{
    student st1;
    st1.name = name + st.name;
    st1.number = number + st.number;
    return st1;
}
student::~student()
{
    //dtor
}

 

#include <iostream>

#include "include/student.h"
using namespace std;

int main()
{
    student st1(1,"lee");
    student st2(2,"boy");
    student st3;
    st3 = st1 + st2;/*操作符+的使用就像一般调用函数一样。此处还可以写成st3 = st1.operator+(st2); st1.operator+(st2)的返回值为student的一个副本,也就是st1 + st2为返回的副本。多数时操作符重载会使用返回引用,也就是无需复制构造的过程(但被引用的对象会被修改,如果这里使用返回引用,则只能使用修改当前对象st1的方法:student& student::operator+(const student& st)
{
    name = name + st.name;
    number = number + st.number;
    return *this;
})。*/ 
    st2.print();
    st3.print();
    return 0;
}

 

使用返回引用的方法:

 其他操作符重载

.h文件

#pragma once
#include <iostream>
using namespace std;

class Book
{
	friend ostream& operator<<(ostream &ost,const Book &bk);  //声明友元
	friend istream& operator>>(istream &ist, Book &bk);
public:
	Book(void);
	Book(string str, int id);
	~Book(void);
public:
	//重载声明
	Book& operator=(const Book &bk);
	Book& operator+=(const Book &bk);
	Book  operator+(const Book &bk);
	Book& operator[](int num);
	//int只是用来区别前加还是后加,放在哪个里边都可以
	Book  operator++();          //后++     
	Book& operator++(int);       //前++
private:
	string m_sName;
	int    m_iId;
};

 


 .cpp文件 部分代码省略

Book::Book(string str, int id):m_sName(str), m_iId(id)
{
}

Book& Book::operator=(const Book &bk)
{
	this->m_sName = bk.m_sName;
	this->m_iId   = bk.m_iId;
	return *this;
}
Book& Book::operator+=(const Book &bk)
{
	this->m_sName += bk.m_sName;
	this->m_iId   += bk.m_iId;
	return *this;
}
Book  Book::operator+(const Book &bk)
{
	Book t_Bk = *this;
	t_Bk     += bk;			//调动+=,修改类时,只需修改+
	return t_Bk;
}
Book& Book::operator[](int num)   
{
	return *(this+num);     //下标操作就是一定量的偏移
}

//后++
Book  Book::operator++()
{
	Book temp = *this;
	this->m_iId++;
	return temp;
}
 //前++
Book& Book::operator++(int)
{
	this->m_iId++;
	return *this;
}


主程序:

// OverOperator.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Book.h"
#include <string>

ostream& operator<<(ostream &ost,const Book &bk);
istream& operator>>(istream &ist, Book &bk);
int _tmain(int argc, _TCHAR* argv[])
{
	//Book book1("lee",566);
	//Book book2 = book1;			//=重载
	//Book book3 = book2;
	//book3 += book1;				//+=重载
	//Book book4 = book1 + book2;   //+重载
	
	//流重载测试
	//cout << book2 <<endl;		    //<<重载
	//cout << book3 <<endl;
	//cout << book4 <<endl;
	/*Book bk1,bk2;
	cin >> bk1 >> bk2;
	cout << bk1 << bk2;*/
	
	//[]重载测试
	/*Book *bk = new Book[5];
	cin >> bk[1];
	cin >> bk[2];
	cout << bk[2] << bk[1];*/

	//++运算测试
	Book book1("lee",566);
	//运算是从右往左运行的:名字:leeID号码:568名字:leeID号码:567名字:leeID号码:568
	cout << book1 << book1++ << ++book1;     
	system("pause");
	return 0;
}
/*
 * 返回类型不是类的类型,无法将重载操作符函数作为类的成员函数,因此使用友元方式。
 * 对于<<,IO标准库中原先具有两个操作数,所以形参也要有两个操作数保持数量一直。
 * 建议只有=,+=定义为类成员,其他操作符用友元实现
 */
ostream& operator<<(ostream &ost, const Book &bk)
{
	ost << "名字:" << bk.m_sName << "ID号码:" << bk.m_iId ;
	return ost;
}
istream& operator>>(istream &ist, Book &bk)
{
	ist >> bk.m_sName >> bk.m_iId;
	return ist;
}




 

 

posted @ 2011-12-22 20:49  java简单例子  阅读(2891)  评论(0编辑  收藏  举报