C 運算子過載顯示呼叫與隱式呼叫的轉換關係

2021-05-27 04:34:27 字數 2746 閱讀 6269

操作符過載

一.運算子過載的含義與定義方式

l         c++已有的運算子只適合處理c++的基本資料型別。

l         c++允許重新定義已有的運算子(運算子過載),以便它能處理程式設計師定義型別(類型別)。

l         運算子過載就是賦予已有的運算子多重含義。運算子過載與函式過載類似,是它的特殊型別。

l         c++通過重新定義運算子,使它能夠用於特定類的物件執行特定的功能。

l         通過對+,-,*,/運算子的重新定義,使它們可以完成複數、分數等不同類的物件的加、減、乘、除運算操作。增強了c++語言的擴充能力。

l         先建立乙個運算子函式,一般定義成類的成員函式或友元函式。

二.過載乙個運算子原則:

1.不能改變運算子的初始意義。  

(只是一種規範)

2.不能改變運算子的引數數目。如過載運算子+時只用乙個運算元是錯誤的。

3.運算子函式不能包括預設的引數。

4.絕大部分c++運算子都可以過載,除以下的例外:

5.除賦值運算子外,其它運算子函式都可以由派生類繼承。

6.運算子過載不改變運算子的優先順序和結合性,也不改變運算子的語法結構,即單目、雙目運算子只能過載為單目、雙目運算子。

7.運算子的過載實際上是函式的過載。編譯程式對運算子過載的選擇,遵循函式過載的選擇原則。當遇到不很明顯的運算子時,編譯程式將去尋找引數匹配的運算子函式。

8.運算子過載可使程式更簡潔,使表示式更直觀,增強可讀性。但使用不宜過多。

9.過載運算子含義必須清楚:

如有乙個類time,它有三個資料成員時、分、秒

calss time

time(int h,int m,int s)

private:

int hours, minutes, seconds;

time t1(8,10,20), t2(9,15,30), t3;

t3=t1+t2;

這裡加法(+)運算用於類time的物件,就是含義不清的。所以不能給類time定義過載運算子+。

三.運算子過載函式的兩種形式:(主要是c++編譯器的解釋原則,比較有用)

成員函式形式和友元函式形式,他們都可訪問類中的私有成員。

1.過載為類的成員函式

1)x類中過載一元運算子@

返回型別   x::operator@( )

不指定引數,因為它已帶有乙個隱含的this引數,對x類的乙個物件obj:

表示式                c++編譯器的解釋

@obj                  operator @(obj)

obj@                  operator @(obj,0)

2)  x類中過載二元運算子@

返回型別   x::operator@(引數說明)

由於類的成員函式帶有乙個this引數,此時只能指定乙個引數,對obj物件:

表示式                c++編譯器的解釋

obj1@obj2

obj1·operator@(obj2)

例:給複數運算子過載的四則運算符。複數由實部和虛部構造,定義乙個複數類,再在類中過載複數四則運算的運算子。

#include

class complex

complex complex::operator+(complex &c)

complex complex::operator-(complex &c)

void print(complex &c )

只能為友元運算子指定乙個引數,對x類的乙個物件obj:

表示式                c++編譯器的解釋

@obj                  operator @(obj)

obj@                  operator @(obj,0)

2) x類中過載二元運算子@

返回型別 operator@(引數說明1,引數說明2) ]

兩個引數中必須至少有乙個是x類型別,設有物件obj1,obj2

表示式                c++編譯器的解釋

obj1@obj2

operator @(obj1,obj2)

例:用友元函式代替成員函式編上述程式:

#include

class complex

complex operator+(complex &c1,complex &c2)

complex operator-(complex &c1,complex &c2)

void print(complex &c )

a(int i,int j)

a(a &p)

a& operator =(a &p);

int getx()

int gety()

private:

int x,y;

a& a::operator =(a &p)

x=p.x;

y=p.y;

cout<<"assignment operator called.\n";

return *this;

void main()

a a(7,8);

a b;

b=a;

cout7,8該程式中,在類a中定義了乙個賦值運算子函式,被定義為成員函式。

b=a解釋為: b.operator=(a)

呼叫下列函式:a& a::operator=(a &p)完成賦值操作。

顯示呼叫和隱式呼叫

使用類名呼叫時顯式呼叫。c 中,顯式介面只能使用介面呼叫,隱式介面使用類和介面呼叫皆可。c 首先動態庫分為顯示呼叫和隱式呼叫,這個的區別呢,顯示呼叫 需要loadlibray和freelibrary,隱式呼叫不需要loadlibrary和freelibrary,只是需要匯入相關的lib檔案,因此,如...

java 隱式呼叫和顯示呼叫

當我們在呼叫類的構造器來建立物件的時候,首先要呼叫的是父類的非靜態的初始化塊,接著會呼叫構造器,但是父類的構造器可能有多個,也就是過載,當呼叫完父類的非靜態初始化塊之後,將會呼叫的是當前類的非靜態初始化塊然後是自身的建構函式,呼叫父類的建構函式就有兩種呼叫的方式,乙個是顯示呼叫,另乙個是隱式呼叫,下...

dll顯示呼叫和隱式呼叫

pragma once 避免重複編譯 ifdef creatdll exports 這個巨集只要你選了專案配置型別為.dll,在預處理器裡會自動包含.define dll api declspec dllexport else define dll api declspec dllimport 當編...