詳解C++程序中定義struct結(jié)構(gòu)體的方法
什么是結(jié)構(gòu)體?
簡(jiǎn)單的來說,結(jié)構(gòu)體就是一個(gè)可以包含不同數(shù)據(jù)類型的一個(gè)結(jié)構(gòu),它是一種可以自己定義的數(shù)據(jù)類型,它的特點(diǎn)和數(shù)組主要有兩點(diǎn)不同,首先結(jié)構(gòu)體可以在一個(gè)結(jié)構(gòu)中聲明不同的數(shù)據(jù)類型,第二相同結(jié)構(gòu)的結(jié)構(gòu)體變量是可以相互賦值的,而數(shù)組是做不到的,因?yàn)閿?shù)組是單一數(shù)據(jù)類型的數(shù)據(jù)集合,它本身不是數(shù)據(jù)類型(而結(jié)構(gòu)體是),數(shù)組名稱是常量指針,所以不可以做為左值進(jìn)行運(yùn)算,所以數(shù)組之間就不能通過數(shù)組名稱相互復(fù)制了,即使數(shù)據(jù)類型和數(shù)組大小完全相同。
結(jié)構(gòu)體的定義
定義結(jié)構(gòu)體使用struct修飾符,例如:
struct test { float a; int b; };
上面的代碼就定義了一個(gè)名為test的結(jié)構(gòu)體,它的數(shù)據(jù)類型就是test,它包含兩個(gè)成員a和b,成員a的數(shù)據(jù)類型為浮點(diǎn)型,成員b的數(shù)據(jù)類型為整型。
由于結(jié)構(gòu)體本身就是自定義的數(shù)據(jù)類型,定義結(jié)構(gòu)體變量的方法和定義普通變量的方法一樣。
test pn1;
這樣就定義了一test結(jié)構(gòu)體數(shù)據(jù)類型的結(jié)構(gòu)體變量pn1,結(jié)構(gòu)體成員的訪問通過點(diǎn)操作符進(jìn)行,pn1.a=10 就對(duì)結(jié)構(gòu)體變量pn1的成員a進(jìn)行了賦值操作。
注意:結(jié)構(gòu)體生命的時(shí)候本身不占用任何內(nèi)存空間,只有當(dāng)你用你定義的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量的時(shí)候計(jì)算機(jī)才會(huì)分配內(nèi)存。
結(jié)構(gòu)體,同樣是可以定義指針的,那么結(jié)構(gòu)體指針就叫做結(jié)構(gòu)指針。
結(jié)構(gòu)指針通過->符號(hào)來訪問成員,下面我們就以上所說的看一個(gè)完整的例子:
#include <iostream> #include <string> using namespace std; struct test//定義一個(gè)名為test的結(jié)構(gòu)體 { int a;//定義結(jié)構(gòu)體成員a int b;//定義結(jié)構(gòu)體成員b }; void main() { test pn1;//定義結(jié)構(gòu)體變量pn1 test pn2;//定義結(jié)構(gòu)體變量pn2 pn2.a=10;//通過成員操作符.給結(jié)構(gòu)體變量pn2中的成員a賦值 pn2.b=3;//通過成員操作符.給結(jié)構(gòu)體變量pn2中的成員b賦值 pn1=pn2;//把pn2中所有的成員值復(fù)制給具有相同結(jié)構(gòu)的結(jié)構(gòu)體變量pn1 cout<<pn1.a<<"|"<<pn1.b<<endl; cout<<pn2.a<<"|"<<pn2.b<<endl; test *point;//定義結(jié)構(gòu)指針 point=&pn2;//指針指向結(jié)構(gòu)體變量pn2的內(nèi)存地址 cout<<pn2.a<<"|"<<pn2.b<<endl; point->a=99;//通過結(jié)構(gòu)指針修改結(jié)構(gòu)體變量pn2成員a的值 cout<<pn2.a<<"|"<<pn2.b<<endl; cout<<point->a<<"|"<<point->b<<endl; cin.get(); }
總之,結(jié)構(gòu)體可以描述數(shù)組不能夠清晰描述的結(jié)構(gòu),它具有數(shù)組所不具備的一些功能特性。
再看一下下面這段結(jié)構(gòu)體的定義:
struct point { int x; int y; };
這段代碼在C++里面其實(shí)簡(jiǎn)單,point是一個(gè)類(class), 且由于用了struct關(guān)鍵字,那么x,y都是public的。然而在C里面,事情沒這么簡(jiǎn)單。在C里面point只是一個(gè)tag, struct point才是一個(gè)完整的類型名稱, 所以在C里面,用聲明一個(gè)poin變量,需要這么寫:struct point pt; 而在C++可以直接寫:point pt;
在C里面想直接用類似C++的方法定義變量,需要用typedef, 比如
typedef struct point { int x; int y; } Point;
那么就可以直接寫Point pt; 了。之所以想寫這個(gè)總結(jié)是因?yàn)樽约涸谟胹truct的時(shí)候總是用的不倫不類,比如下面的用法就是不好的我覺得:
struct Point { int x; int y; }; Point pt;
這段代碼是定義pt是C++的用法, 涉及到類,但是定義這個(gè)類又只有兩個(gè)public的成員變量,像極了純C的struct結(jié)構(gòu)體。這就有點(diǎn)不倫不類了,如果要從面向?qū)ο蟮慕嵌?,最好就還是把Point定義成class, 然后加上getX, setX, getY, setY去access還有modify成員變量,還要加一個(gè)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;
上面的代碼的風(fēng)格是很好的,而且也不會(huì)不倫不類,但是就是稍微有點(diǎn)小題大做或者殺雞用牛刀的感覺,為什么這么說呢,比如有時(shí)候我們其實(shí)很想方便的修改x, y,覺得直接賦值更加自然,何必調(diào)用一個(gè)函數(shù)呢,這個(gè)感覺來自于面向過程的C,如果這樣, 我覺得下面這個(gè)代碼也是可以接受的比較自然的一種代碼(還是面向?qū)ο蟮乃季S,但是僅僅省略getter和setter而直接access成員變量):
struct Point { int x; int y; Point(int vx, int vy): x(vx), y(vy) {} };
總結(jié):
C和C++里面的struct還是需要好好理解,一個(gè)是面向過程,一個(gè)是面向?qū)ο?,使用的時(shí)候千萬不要不倫不類。我覺得C++的面向?qū)ο蟮挠梅ū容^合理,C面向過程的用法還是太繁瑣不夠靈活,建議使用倒數(shù)第一和倒是第二種struct代碼風(fēng)格。
欄 目:C語言
下一篇:深入理解c++常成員函數(shù)和常對(duì)象
本文標(biāo)題:詳解C++程序中定義struct結(jié)構(gòu)體的方法
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2289.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置