1. 程式人生 > >C++基礎學習筆記:運算子過載

C++基礎學習筆記:運算子過載

(運算子過載和類轉換的練習程式碼)

標頭檔案:

//MyClass.h
#pragma once
#include <iostream>
//設計一個簡單的類來熟悉運算子過載與類的轉換
class MyClass
{
private:
	int num;//私有成員變數
public:
	//建構函式:物件的初始化操作
	//只接受一個引數的構造定義了引數型別到類型別的轉換,
	//預設為隱式轉換,通過explicit關鍵字限制為顯式轉換。
	explicit MyClass(int n=0);
	//拷貝構造:形如MyClass a(b),其中b是一個MyClass型別
	MyClass(MyClass &myc);
	//賦值運算子:只能為成員函式,物件之間的賦值操作
	MyClass &operator=(MyClass &myc);
	int Add(int n);
	int Add(MyClass &myc);
	//成員函式進行運算子過載,使用關鍵字operator加上一個運算子,
	//a+n如同a.operator+(n),自身通過this指標操作。
	int operator+(int n);
	//轉換函式:必須是類方法、無引數與返回值。
	explicit operator int() const;
	//友元函式進行運算子過載
	friend int operator+(MyClass &a,MyClass &b);
	//輸入輸出流的過載,記得返回一個流引用,方便連續的輸入輸出操作。
	friend std::ostream & operator << (std::ostream &os, MyClass &myc);
	friend std::istream & operator >> (std::istream &is, MyClass &myc);
	//解構函式
	~MyClass();
};

類實現:

//MyClass.cpp
#include "MyClass.h"
MyClass::MyClass(int n)
{
	num = n;
}
MyClass::MyClass(MyClass &myc)
{
	num = myc.num;
}
MyClass & MyClass::operator=(MyClass &myc)
{
	if (this == &myc)
		return *this;
	num = myc.num;
	return *this;
}
int MyClass::Add(int n)
{
	num += n;
	return num;
}
int MyClass::Add(MyClass &myc)
{
	num += myc.num;
	return num;
}
int MyClass::operator+(int n)
{
	return num + n;
}
MyClass::operator int() const
{
	return num;
}
int operator+(MyClass &a, MyClass &b)
{
	return a.num + b.num;
}
std::ostream & operator << (std::ostream &os, MyClass &myc)
{
	os << myc.num;
	return os;
}
std::istream & operator >> (std::istream &is, MyClass &myc)
{
	is >> myc.num;
	return is;
}
MyClass::~MyClass()
{

}

使用:

//user.cpp
//!時間:2017年9月10日(週日)夜
//!內容:運算子過載與類的轉換
//!最後更新時間:NULL
#include <iostream>
#include <cstdlib>//rand()
#include <ctime>//time()
//<>和""表示編譯器在搜尋標頭檔案時的順序不同,
//<>表示從系統目錄下開始搜尋,再到PATH環境變數目錄,不搜尋當前目錄,
//""是表示從當前目錄開始搜尋,然後是系統目錄和PATH環境變數目錄。
#include "MyClass.h"
int main()
{
	using namespace std;
	/*//插曲:產生隨機數
	srand((unsigned)time(nullptr));//種子預設為1
	for (int i = 0; i < 10; i++)
		cout << rand() %10<< '-' << endl;*/

	//
	MyClass a, b;
	a.Add(5);
	b = a;//賦值操作
	MyClass c(a);//拷貝構造
	a = (MyClass)2;//因為使用了explicit關鍵字,需要顯式轉換
	int i = (int)a;//因為使用了explicit關鍵字,需要顯式轉換
	i = a + b;//使用友元版本+
	i = a + 1;//使用成員版本+
	cin >> b;
	cout << i << a << b << c << endl;
	system("pause");
	return 0;
}