詳解C++法式中界說struct構造體的辦法。本站提示廣大學習愛好者:(詳解C++法式中界說struct構造體的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++法式中界說struct構造體的辦法正文
甚麼是構造體?
簡略的來講,構造體就是一個可以包括分歧數據類型的一個構造,它是一種可以本身界說的數據類型,它的特色和數組重要有兩點分歧,起首構造體可以在一個構造中聲明分歧的數據類型,第二雷同構造的構造體變量是可以互相賦值的,而數組是做不到的,由於數組是單一數據類型的數據聚集,它自己不是數據類型(而構造體是),數組稱號是常量指針,所以弗成以做為左值停止運算,所以數組之間就不克不及經由過程數組稱號互相復制了,即便數據類型和數組年夜小完整雷同。
構造體的界說
界說構造體應用struct潤飾符,例如:
struct test { float a; int b; };
下面的代碼就界說了一個名為test的構造體,它的數據類型就是test,它包括兩個成員a和b,成員a的數據類型為浮點型,成員b的數據類型為整型。
因為構造體自己就是自界說的數據類型,界說構造體變量的辦法和界說通俗變量的辦法一樣。
test pn1;
如許就界說了一test構造體數據類型的構造體變量pn1,構造體成員的拜訪經由過程點操作符停止,pn1.a=10 就對構造體變量pn1的成員a停止了賦值操作。
留意:構造體性命的時刻自己不占用任何內存空間,只要當你用你界說的構造體類型界說構造體變量的時刻盤算機才會分派內存。
構造體,異樣是可以界說指針的,那末構造體指針就叫做構造指針。
構造指針經由過程->符號來拜訪成員,上面我們就以上所說的看一個完全的例子:
#include <iostream> #include <string> using namespace std; struct test//界說一個名為test的構造體 { int a;//界說構造體成員a int b;//界說構造體成員b }; void main() { test pn1;//界說構造體變量pn1 test pn2;//界說構造體變量pn2 pn2.a=10;//經由過程成員操作符.給構造體變量pn2中的成員a賦值 pn2.b=3;//經由過程成員操作符.給構造體變量pn2中的成員b賦值 pn1=pn2;//把pn2中一切的成員值復制給具有雷同構造的構造體變量pn1 cout<<pn1.a<<"|"<<pn1.b<<endl; cout<<pn2.a<<"|"<<pn2.b<<endl; test *point;//界說構造指針 point=&pn2;//指針指向構造體變量pn2的內存地址 cout<<pn2.a<<"|"<<pn2.b<<endl; point->a=99;//經由過程構造指針修正構造體變量pn2成員a的值 cout<<pn2.a<<"|"<<pn2.b<<endl; cout<<point->a<<"|"<<point->b<<endl; cin.get(); }
總之,構造體可以描寫數組不克不及夠清楚描寫的構造,它具稀有組所不具有的一些功效特征。
再看一下上面這段構造體的界說:
struct point { int x; int y; };
這段代碼在C++外面其實簡略,point是一個類(class), 且因為用了struct症結字,那末x,y都是public的。但是在C外面,工作沒這麼簡略。在C外面point只是一個tag, struct point才是一個完全的類型稱號, 所以在C外面,用聲明一個poin變量,須要這麼寫:struct point pt; 而在C++可以直接寫:point pt;
在C外面想直接用相似C++的辦法界說變量,須要用typedef, 好比
typedef struct point { int x; int y; } Point;
那末便可以直接寫Point pt; 了。之所以想寫這個總結是由於本身在用struct的時刻老是用的不正經,好比上面的用法就是欠好的我認為:
struct Point { int x; int y; }; Point pt;
這段代碼是界說pt是C++的用法, 觸及到類,然則界說這個類又只要兩個public的成員變量,像極了純C的struct構造體。這就有點不正經了,假如要從面向對象的角度,最好就照樣把Point界說成class, 然後加上getX, setX, getY, setY去access還有modify成員變量,還要加一個constructor和destructor:
class Point { public: Point(int vx, int vy): x(vx), y(vy) {} ~Point() {} int getX() const { return x; } //const means 'this' is constant int getY() const { return y; } void setX(int value) { x = value; } void setY(int value) { y = value; } private: int x; int y; }; Point pt;
下面的代碼的作風是很好的,並且也不會不正經,然則就是略微有點小題年夜做或許殺雞用牛刀的感到,為何這麼說呢,好比有時刻我們其實很想便利的修正x, y,認為直接賦值加倍天然,何須挪用一個函數呢,這個感到來自於面向進程的C,假如如許, 我認為上面這個代碼也是可以接收的比擬天然的一種代碼(照樣面向對象的思想,然則僅僅省略getter和setter而直接access成員變量):
struct Point { int x; int y; Point(int vx, int vy): x(vx), y(vy) {} };
總結:
C和C++外面的struct照樣須要好好懂得,一個是面向進程,一個是面向對象,應用的時刻萬萬不要不正經。我認為C++的面向對象的用法比擬公道,C面向進程的用法照樣太繁瑣不敷靈巧,建議應用倒數第一和卻是第二種struct代碼作風。