[C++]试一试结构体struct node的构造函数
可直接點擊跳轉到構造函數處
- 結構體概念
- 定義結構體
- 定義結構體及結構體變量
- 結構體變量的特點
- 成員調用
- 成員函數調用
- 結構體的構造函數
- Upd1
- Upd2
- Upd3
結構體概念
在實際問題中,一組數據往往具有不同的數據類型。
例如:人口大普查時,需要記錄每一個人的姓名,年齡,性別,身份證等
這些信息分別要用整型,字符型,字符串型來記錄。
為了解決這種問題,C++語言給出了另一個構造數據類型——“結構體”,
它在數據存儲方面相當于其他高級語言的記錄,但它有這面向對象的優勢
定義結構體
定義結構體及結構體變量
有兩種形式:
1:
struct 結構體類型名 //struct是關鍵字
成員表; //可以有多個成員
成員函數; //可以有多個成員函數,也可以沒有
}結構體變量表; //可以同時定義多個,用“,”隔開
舉個栗子
struct node { //定義了一個名叫node的struct類型string name;int math, chinese;int total; }a[150];//定義了a數組變量2:
struct 結構體類型名{
成員表;
成員函數;
};
結構體名 結構體變量名
舉個栗子:
struct node {string name;int math, chinese;int total; }; node a[150];在定義結構體時注意,結構體變量名和結構體名不能相同。在定義結構體時,系統對其不分配實際內存,只有在定義結構體變量時,系統才為其分配內存
結構體變量的特點
(1)結構體變量可以整體操作,例如:
swap ( a[i], a[i + 1] ); //兩個結構體變量里面的所有變量都進行交換(2)結構體變量的成員訪問也很方便清晰
cin >> a[i].name;(3)結構體變量的初始化和數組的初始化類似
node opt = { "xiaoming", 12, 34, 1243 };成員調用
結構體變量和各個成員之間的引用的一般形式為:
結構體變量.成員名
我們還可以這樣操作
cin >> a[i].name //一般情況下不能寫成cin>>a[i]; a[i].total = a[i].math + a[i].chinese;實際上結構體成員的操作與該成員類型所具有的操作是一致的
成員運算符“.”在存取成員數值時使用其優先級最高,并且具有左結合性
在處理結構體包含結構體的時候,可寫作
strua.strub.memb
表示結構體變量strua有結構體成員strub;結構體變量strub有成員memb
成員函數調用
結構體成員函數調用的一般形式為:
結構體變量.成員函數
結構體成員函數默認將結構體變量作為應用參數
結構體的構造函數
這個才是我寫這篇博客的原因
運行結果如下,計算機自動從左到右依次匹配,把2匹配給n1,3匹配給n2
這種構造函數等同于以下多種的寫法:
1.
但是如果寫成這樣,計算機是無法識別的
node a;a = node ( 2, 3 );但是我又想讓計算機識別該怎么辦呢??
這個時候就需要在構造函數前面再加一句
這個時候你就發現計算機正常運轉了
當然構造函數里面可以多傳幾個,也可以選擇不用傳的參數,如:
但是有可能大家會看到一些大犇將構造函數寫成這樣子
可能會疑惑為什么構造函數里面的變量定義要給賦初值呢?
可以這么想:先提前申請多個變量,后面進行構造函數傳參的時候,就算我們傳得不夠多,也能保證每個成員是有初值的,而不是隨機亂碼
也可以這么理解,如果我們沒有給一些成員傳參賦值,那么默認成員的值就被賦值成我們定義變量的初值,如圖
注意,因為結構體是默認從左開始匹配,所以如果少傳幾個參數,前面的n1,n2肯定是有值的,換言之,計算機會自動先把前面的滿足了,才往后推進
這也是為什么要賦初值的原因,如果我們不賦,后面的構造函數傳參傳少了,不管后面用沒用到了那一個參數,就會被計算機報錯,認為那是一個亂碼很危險,如圖
最后還是溫馨提示,構造函數很難搞,經常容易出問題,所以大家可以采取最原始的賦值方式,盡管我喜歡構造函數
node a; a.p1 = 2; a.p2 = 4; a.p3 = a.p1 * a.p2;Upd1
時隔許久回來看這篇寫的博客,只想由衷的感嘆一句
構造函數一點都不難,只要不作死
現在基本上我的結構體構造函數已經固定寫法了
如果你是一名競賽生,不建議寫各種炫技的騷操作,like this👇
struct node {int ...;node( int ... )...(), ...() {} }因為好像是不同的編譯器標準有所出入,C++11C++11C++11下似乎可以識別,但是有些就會報錯
建議以后寫構造函數前
都加上一句
這個語句,我自身理解為向計算機發送一種信號,告訴它我將以這種形式使用構造函數
不理解也沒關系,反正多敲幾個字符也少不了多少肉
加上這一句后,構造函數的兩種使用
計算機都能識別成為同一個意思語句
但如果不加,就只能使用原配
struct node {int p1, p2;node( int n1, int n2 ) {p1 = n1, p2 = n2;} } node a = { node } ( 2, 3 );老實說,如果不加這一句,后面的構造函數可有可無,計算機都能識別原配寫法
即這么寫,照樣正常運行
這里就多說一說這美麗的一行代碼
其實它可以不為空
這段里面的內容意思就是
一旦你申請了一個結構體aaa,計算機自動的就完成了a.p1=2a.p1=2a.p1=2的賦值以及結構體嵌套數組的清零操作,不用自己在里面手打一個clearclearclear函數就能起到同樣的效果
經常在矩陣快速冪等各種場合的時候使用
Upd2
再提一句,構造函數的原配法則
上面的寫法是
struct node {int a, b; }; node x = { node } ( 2, 3 );實際上,還可以更“原配”
struct node {int a, b; }; node x = { 2, 3 };對,沒錯,直接用大括號把賦的值包起來,連結構體名都不用寫了
但是像這種計算機默認的寫法,肯定是有自己鐵一樣的規矩的
——一定是按順序依次賦值
也就是說,在結構體里面定義變量的順序是,a,然后b
那么后面賦值的順序,也一定是a=2,b=3
就不能像自己重載構造函數那么隨意
struct node {int a, b;node(){}node( int A, int B ) { b = A, a = B; } }; node x = node( 2, 3 );這里更新主要是想說,原配也有傳參數量不夠的情況
struct node {int a, b, c, d; }; node x = { 2, 3 };這樣還是a=2,b=3,但是c,d就不知道咯
Upd3
還有在初始化/初定義一個結構體的時候,連=都不要
node x( 2, 3 );但這種寫法必須建立在重載構造函數的基礎上,計算機的原配是不會認識的
struct node {int a, b;node(){}node( int A, int B ) { a = A, b = B; } }; node x( 2, 3 )最后,現在官方都開c++14了,老實說,博主自己的構造函數都越寫越簡單了
私以為,沒必要再像以前小心翼翼,但當然求穩肯定不是劣策
總結
以上是生活随笔為你收集整理的[C++]试一试结构体struct node的构造函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程主机一键唤醒远程主机一键唤醒电脑
- 下一篇: 荒野大镖客2配置要求及电脑配置单推荐荒野