結構體,是一種可以自己編寫資料型別(如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 bigger 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 過載運算子詳解
c 允許我們為我們的類重定義或過載大部分c 內建的運算子。這樣我們的類就可以通過這些運算子進行一些操作。比如加減乘除,賦值比較等。過載的運算子是帶有特殊名稱的函式,函式名是由關鍵字 operator 和其後要過載的運算子符號構成的。與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。比如我們要給...
置頂 C 過載運算子詳解
有些東西或許大家已經知道,請使用目錄 結構體,是一種可以自己編寫資料型別 如int,double等 的一種資料集合,宣告關鍵字struct,框架 宣告於main之外 struct 名稱 分號一定不要忘了例如 struct student 這樣你就成功定義了乙個 student 型別的資料集合,這意味...
C 過載運算子
運算子過載是一種形式的c 多型。在c 中,編譯器有能力把乙個由資料 物件和操作符共同組成的表示式,解釋為對乙個全域性或成員函式的呼叫。該全域性或成員函式被稱為操作符函式,通過重定義操作符函式,可以實現針對自定義型別 結構,類 的運算法則,並使之與內建型別一樣參與各種表示式。過載運算子可使 看起來更加...