1. 程式人生 > >C++運算子過載(成員函式方式)

C++運算子過載(成員函式方式)

一、運算子過載

C++中預定義的運算子的操作物件只能是基本資料型別,實際上,對於很多使用者自定義型別,也需要有類似的運算操作。如果將C++中這些現存的運算子直接作用於使用者自定義的型別資料上,會得到什麼樣的結果呢?編譯器無法給出正常的結果,因為我們需要運算子過載,給運算子賦予多重含義,使同一個運算子作用於不同型別的資料導致不同型別的行為,增強了運算子的普適性。



運算子過載的實質是函式過載。在實現過程中,首先把指定的運算表示式轉化為對運算子函式的呼叫,運算物件轉化為運算子函式的實參,然後根據實參的型別來確定需要呼叫達標函式,這個過程在編譯過程中完成。

運算子過載規則如下: 
①、 C++中的運算子除了少數幾個之外,全部可以過載,而且只能過載C++中已有的運算子。 
②、 過載之後運算子的優先順序和結合性都不會改變。 
③、 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原運算子的操作物件個數,同時至少要有一個操作物件是自定義型別。 

C++中只有五個運算子不能被過載,它們是:成員運算子“.”指標運算子“*”作用域運算子“::”“sizeof”條件運算子“?:”。 

運算子過載形式有兩種,過載為類的成員函式和過載為類的友元函式。 

運算子過載為類的成員函式的一般語法形式為:

函式型別 operator 運算子(形參表) 
{ 
	函式體;
} 
運算子過載為類的友元函式的一般語法形式為: 
friend 函式型別 operator 運算子(形參表) 
{ 
	函式體; 
} 

其中,函式型別就是運算結果型別;operator是定義運算子過載函式的關鍵字;運算子是過載的運算子名稱。 
當運算子過載為類的成員函式時,函式的引數個數比原來的操作個數要少一個;當過載為類的友元函式時,引數個數與原運算元個數相同。原因是過載為類的成員函式時,如果某個物件使用過載了的成員函式,自身的資料可以直接訪問,就不需要再放在引數表中進行傳遞,少了的運算元就是該物件本身。而過載為友元函式時,友元函式對某個物件的資料進行操作,就必須通過該物件的名稱來進行,因此使用到的引數都要進行傳遞,運算元的個數就不會有變化。 
運算子過載的主要優點就是允許改變使用於系統內部的運算子的操作方式,以適應使用者自定義型別的類似運算。

二、運算子過載程式例子(成員函式方式)

//運算子過載:成員函式方式
#include <iostream>
using namespace std;

class complex //複數類
{
public:
	complex(){ real = imag = 0;}
	complex(double r, double i)
	{
		real = r;
		imag = i;
	}
	complex operator + (const complex &c);
	complex operator - (const complex &c);
	complex operator * (const complex &c);
	complex operator / (const complex &c);

	friend void print(const complex &c); //友元函式

private:
	double real; //實部
	double imag; //虛部

};

inline complex complex::operator + (const complex &c) //定義為行內函數,程式碼複製,運算效率高
{
	return complex(real + c.real, imag + c.imag);
}

inline complex complex::operator - (const complex &c)
{
	return complex(real - c.real, imag - c.imag);
}

inline complex complex::operator * (const complex &c)
{
	return complex(real * c.real - imag * c.imag, real * c.real + imag * c.imag);
}

inline complex complex::operator / (const complex &c)
{
	return complex( (real * c.real + imag * c. imag) / (c.real * c.real + c.imag * c.imag), 
		(imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.imag) );
}

void print(const complex &c) 
{
	if(c.imag < 0)
		cout<<c.real<<c.imag<<'i'<<endl;
	else
		cout<<c.real<<'+'<<c.imag<<'i'<<endl;
}

int main()
{	
	complex c1(2.0, 3.5), c2(6.7, 9.8), c3;
	c3 = c1 + c2;
	cout<<"c1 + c2 = ";
	print(c3); //友元函式不是成員函式,只能採用普通函式呼叫方式,不能通過類的物件呼叫

	c3 = c1 - c2;
	cout<<"c1 - c2 = ";
	print(c3);

	c3 = c1 * c2;
	cout<<"c1 * c2 = ";
	print(c3);

	c3 = c1 / c2;
	cout<<"c1 / c2 = ";
	print(c3);
	return 0;
}

三、程式執行結果



相關推薦

C++運算子過載成員函式方式

一、運算子過載 C++中預定義的運算子的操作物件只能是基本資料型別,實際上,對於很多使用者自定義型別,也需要有類似的運算操作。如果將C++中這些現存的運算子直接作用於使用者自定義的型別資料上,會得到什麼樣的結果呢?編譯器無法給出正常的結果,因為我們需要運算子過載,給運算子賦

C++運算子過載友元函式方式

我們知道,C++中的運算子過載有兩種形式:①過載為類的成員函式(見C++運算子過載(成員函式方式)),②過載為類的友元函式。 當過載友元函式時,將沒有隱含的引數this指標。這樣,對雙目運算子,友元函

成員函式和友元函式 完成二元和一元運算子過載進階1

二元運算子過載: 全域性函式: #include <iostream> using namespace std; class Complex{//複數類 private: int

C++——運算子過載---以成員函式方式過載---以友元函式方式過載

一、運算子的過載   1、運算子的過載   允許把標準運算子(如+ - * /等運算子)應用於自定義資料型別的物件,可以提高程式的可讀性,運算子的過載本質上還是函式過載。運算子僅僅是語法上的方便,它是另一種函式呼叫的方式,只有在設計涉及的程式碼更容易寫,尤其是更容易讀的時候才有必要過載。   2、實現運

c++成員函式過載、覆蓋與隱藏

覆蓋,和隱藏是很不一樣的兩個概念,要重點區分。 過載(overload):同名函式變數,但屬於不同的函式型別。發生在同一個作用域內,即在同一個類中。如果跨類,在父類、子類當中存在同名的函式變數(即便是不同的函式型別),如果是 virtual 性質的,就是過載(也叫繼承,

C++運算子過載注意點,友元使用和優缺點

運算子過載例項程式碼 class A{ public: int a,b; A(int _a=0,int _b=0):a(_a),b(_b){} A operator+(A & tmpa){ A t;

運算子過載18.11.17

一、運算子過載:自定義型別和內建型別滿足的相同的邏輯。分為兩種: 1.普通運算子過載: 1>. <運算子過載,程式碼如下: bool operator<(int rhs) //int rhs形參作為右運算元 { return mdata<rhs; //mdata類成員

VS2010中CUDA和C++混合編譯兩種方式

在做專案整合的時候需要用到cpp和cuda檔案聯調,自己摸索了兩種方式實現cpp和cu檔案混合編譯。 本文環境: windows7 64位VS2010CUDA5.5英偉達顯示卡Tesla C1060 前言 裝好CUDA 5.5 sdk後,預設會自動新增好系統環境變數

運算子過載成員函式

運算子過載實質上就是通過函式過載,過載為成員函式,它就可以自由的訪問本類的資料成員,實際使用時,總是通過該類的某個物件來訪問過載的運算子。如果是雙目運算子,左運算元是物件本身的資料,由this指標指出,就不再需要任何引數。下面分別介紹這兩種情況。

c++運算子定義為成員函式還是非成員函式

=,[],->,()運算子必須是成員,賦值,下標,箭頭訪問,呼叫; 複合賦值運算子一般應該是成員; 改變物件狀態的運算子或與給定型別密切相關的運算子例如遞增減,解引用應該是成員; 具有對稱性的運算子可能轉換任意一端的運算物件,例如==,算術相等性關係,位運算等等 **當把運算子定義為成員函式時,左側必須

基於TCP/IP協議的C++網路程式設計API函式

原始碼:http://download.csdn.net/detail/nuptboyzhb/4169959 基於TCP/IP協議的網路程式設計 定義變數——獲得WINSOCK版本——載入WINSOC

運算子過載實現CString類

private:             char*m_pdate; public: //建構函式 CString::CString(){}; //拷貝構造 CString::CString(const CString& t_cstring) {

C++拷貝建構函式運算子過載VC實現

String.h檔案: #ifndef STRING_H #define STRING_H #include <ostream> using namespace std; class String { public: String(){ m_pStr = nullptr

運算子過載C++

運算子過載: 運算子過載是一種形式的C++多型(C++如何使使用者能夠定義多個名稱相同但特徵不同的函式的方法被稱為函式多型,也稱為函式過載)。 C++允許將運算子過載擴充套件到使用者定義的型別,例如,允許使用+將兩個物件相加。 例如,一個人早上花費了2小時35分

C++學習筆記】運算子過載

我們回顧一下運算子過載的特點: 運算子過載函式名必須為:operator<運算子>。 運算子的過載是通過運算子過載函式來實現的。對於二元運算子過載函式,函式的引數通常為一個即右運算元,運算子的左運算元為呼叫過載函式時的物件。對於一元運算子過載函式,運算子的左運算

C++學習筆記】運算子過載

在C++中我們定義了自己專屬的類,但是隨著類的增加,以及裡面成員複雜度的提高,以前我們常用的運算子就不能很好的處理新出現的資料型別了,這時,就有一個很“異想天開”的想法了——我們自己定義運算子! 運算子的過載 運算子過載是使同一個運算子作用於不同型別的資料時具有不同的行為。例如我們宣

C++基礎知識複習--運算子過載(非成員函式過載成員函式過載)

#include<iostream> using namespace std; class Complex { private: float Vector_x; float Vector

C++:面試時應該實現的string類(建構函式、拷貝建構函式、賦值運算子過載和解構函式

一、string類的4個基本函式是什麼? 建構函式 拷貝建構函式 賦值運算子過載 解構函式 二、函式實現 1.建構函式 String(char* pStr = " ")

運算子過載2———流運算子過載函式

流插入運算子 << class Coordinate{ friend ostream& opeartor<<(ostream &out,const Coordinate &coor); public:

C++中的const成員函式函式聲明後加const,或稱常量成員函式用法詳解

在C++的類定義裡面,可以看到類似下面的定義: 01 class List { 02 private: 03 Node * p_he