置頂 C 過載運算子詳解

2022-05-31 06:18:12 字數 3080 閱讀 9835

↑有些東西或許大家已經知道,請使用目錄↑

結構體,是一種可以自己編寫資料型別(如int,double等)的一種資料集合,宣告關鍵字struct,框架(宣告於main之外):

struct 名稱

;//分號一定不要忘了

例如:

struct student

;

這樣你就成功定義了乙個「student」型別的資料集合,這意味著你可以這樣用:student bob;

你也可以在結構體的最後加上你想定義的資料集合名稱,如:

struct student

bob;

於是就有了乙個名叫bob的變數集合,它裡面包含有bob的name,grade和age;

但是,可能已經有人注意到了,上文「bob的」中的「的」怎麼使用呢?

於是有了乙個運算子:.,它叫做成員運算子,也是一會會提到的少數幾個不能過載的運算子之一,它的用處在於訪問乙個結構體集合中的變數(即成員變數),如:bob.age=13;然後bob這個集合中的年齡就被賦為了13。

當然,結構體之間是可以相互賦值的,這樣裡面的每乙個成員變數都會被賦值。

結構體中不僅可以有成員變數,也可以有成員函式。

這個很簡單,在成員函式中你可以使用你的成員變數,當你需要訪問自己這個結構體時,需要乙個特殊的指標:*this,對於這個最通俗的解釋是:你在乙個房子(結構體)裡裝修,你需要看到或改變房子的外部,就用*this(在講過載運算子實會用到),框架:

struct 名字

};

你會發現,在結構體裡寫函式和在外面寫是基本一樣的,例子:

struct number

int add()

void clean()

};

可以這樣用:

number a

;scanf("%d%d",&a.a,&a.b);

printf("the biger one:%d.\ntheir sums:%d",a.max(),a,add());

a.clean();

建構函式是在定義結構體變數時自動呼叫的函式,用於對結構體成員初始化。

結構體原本是包含乙個預設建構函式的,它沒有引數,函式體也為空,你可以修改這個函式的函式體,但引數列表必須為空。

你也可以寫其他建構函式,但引數的個數或引數型別必須不同,c++將根據實際情形選擇最合適的建構函式去呼叫。

如果你沒有增加建構函式,也沒有修改預設建構函式,預設建構函式便可以省略,但如果你自己定義了建構函式,則預設建構函式必須寫上。

也就是說你可以這樣寫:

struct num

}

當你num a時,a裡面的len和a都被清零了。

過載運算子有什麼用呢?最常用的是高精度運算,以前我們經常用陣列來寫高精度,有了過載運算子和結構體後,就意味著你的main函式中只需要這樣寫:

bignum a,b,c;

a.read();

b.read();

c=a+b;

c.print();

c=a*b;

c.print();

過載是有規則的,首先,「過載運算子」是「過載」,而不是「定義」,所以你只能改變乙個c++中已有的運算子,而不是定義乙個本來沒有的運算子,如果你真的想這樣,請搜尋define。

1.c++只能過載c++中已有的運算子;除了少數幾個運算子不能過載外,全部可以過載,不能過載的操作符是類屬關係運算子」.」、成員指標運算子「*」(當這個作乘號時是可以過載的,你不用在意編譯器的想法~)、作用域分辨符「::」和三目運算子「?:」。

2.過載運算子後的優先順序和結合性都不會改變。

3.過載的運算子要與該運算本身的含義一致,不能導致混亂。

注意:過載運算子時,其引數個數比實際上參與運算的個數少乙個。因為該物件自身也將參與運算。

如果以上規則不容易看懂,下面會有例子。

具體還是要看例子

過載型別 operator

/*這是乙個過載運算子的關鍵字*/ 過載符號(引數)

不用想都知道,肯定不能直接這樣寫:

int a

;bignum a

;a=a

;

所以我們要過載=使它不再只適用於相同型別變數間的賦值,而是用於將int型別賦給bignum型別:

struct bignum

void

/*賦值是乙個不需要返回值的操作*/

operator =(int x)/*這裡的引數實際上是你等號後面的東西,等號前面只能bignum型別,也就是說,只能寫成'bignum = int'的格式才會執行以下內容*/

}

這裡要過載的十分多:>,>=,<,<=,==…那麼是不是要一一寫呢?答案是否定的,實際上你只需要寫出乙個<過載,然後其他運算子都可以用邏輯運算和已經過載的《表示出。

例如判斷》=x可以這樣寫:return !(*thisbool

/*不難理解,只有是或不是兩種關係*/

operator

<(bignum x)//兩個bignum之間的比較

bool

operator > (bignum &x) //事實上反過來比較就是》了

bool

operator

<= (bignum &x)

bool

operator >= (bignum &x)

if(c.s[c.len

-1]==0) c.len--;

return c;//返回結果

}這個非常簡單,成員函式void print()void read(),裡面高精度該怎麼讀怎麼讀即可。

C 過載運算子詳解

結構體,是一種可以自己編寫資料型別 如int,double等 的一種資料集合,宣告關鍵字struct,框架 宣告於main之外 struct 名稱 分號一定不要忘了例如 struct student 這樣你就成功定義了乙個 student 型別的資料集合,這意味著你可以這樣用 student bob...

C 過載運算子詳解

c 允許我們為我們的類重定義或過載大部分c 內建的運算子。這樣我們的類就可以通過這些運算子進行一些操作。比如加減乘除,賦值比較等。過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。比如我們要給...

C 過載運算子

運算子過載是一種形式的c 多型。在c 中,編譯器有能力把乙個由資料 物件和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫。該全域性或成員函式被稱為操作符函式,通過重定義操作符函式,可以實現針對自定義型別 結構,類 的運算法則,並使之與內建型別一樣參與各種表示式。過載運算子可使 看起來更加...