国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

詳解C++程序中定義struct結(jié)構(gòu)體的方法

2020-05-23 14:04:08
字體:
供稿:網(wǎng)友
C++中同樣擁有C語言中的結(jié)構(gòu)體,下面就來詳解C++程序中定義struct結(jié)構(gòu)體的方法,需要的朋友可以參考下
 

什么是結(jié)構(gòu)體?
簡單的來說,結(jié)構(gòu)體就是一個可以包含不同數(shù)據(jù)類型的一個結(jié)構(gòu),它是一種可以自己定義的數(shù)據(jù)類型,它的特點和數(shù)組主要有兩點不同,首先結(jié)構(gòu)體可以在一個結(jié)構(gòu)中聲明不同的數(shù)據(jù)類型,第二相同結(jié)構(gòu)的結(jié)構(gòu)體變量是可以相互賦值的,而數(shù)組是做不到的,因為數(shù)組是單一數(shù)據(jù)類型的數(shù)據(jù)集合,它本身不是數(shù)據(jù)類型(而結(jié)構(gòu)體是),數(shù)組名稱是常量指針,所以不可以做為左值進行運算,所以數(shù)組之間就不能通過數(shù)組名稱相互復(fù)制了,即使數(shù)據(jù)類型和數(shù)組大小完全相同。

結(jié)構(gòu)體的定義

定義結(jié)構(gòu)體使用struct修飾符,例如:

struct test  {    float a;    int b;  };  

 
上面的代碼就定義了一個名為test的結(jié)構(gòu)體,它的數(shù)據(jù)類型就是test,它包含兩個成員a和b,成員a的數(shù)據(jù)類型為浮點型,成員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)體成員的訪問通過點操作符進行,pn1.a=10 就對結(jié)構(gòu)體變量pn1的成員a進行了賦值操作。
注意:結(jié)構(gòu)體生命的時候本身不占用任何內(nèi)存空間,只有當你用你定義的結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量的時候計算機才會分配內(nèi)存。
結(jié)構(gòu)體,同樣是可以定義指針的,那么結(jié)構(gòu)體指針就叫做結(jié)構(gòu)指針。
結(jié)構(gòu)指針通過->符號來訪問成員,下面我們就以上所說的看一個完整的例子:

#include <iostream>   #include <string>   using namespace std;   struct test//定義一個名為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++里面其實簡單,point是一個類(class), 且由于用了struct關(guān)鍵字,那么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; 了。之所以想寫這個總結(jié)是因為自己在用struct的時候總是用的不倫不類,比如下面的用法就是不好的我覺得:

struct Point {  int x;  int y;};Point pt;

這段代碼是定義pt是C++的用法, 涉及到類,但是定義這個類又只有兩個public的成員變量,像極了純C的struct結(jié)構(gòu)體。這就有點不倫不類了,如果要從面向?qū)ο蟮慕嵌龋詈镁瓦€是把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;

上面的代碼的風(fēng)格是很好的,而且也不會不倫不類,但是就是稍微有點小題大做或者殺雞用牛刀的感覺,為什么這么說呢,比如有時候我們其實很想方便的修改x, y,覺得直接賦值更加自然,何必調(diào)用一個函數(shù)呢,這個感覺來自于面向過程的C,如果這樣, 我覺得下面這個代碼也是可以接受的比較自然的一種代碼(還是面向?qū)ο蟮乃季S,但是僅僅省略getter和setter而直接access成員變量):

struct Point {  int x;  int y;  Point(int vx, int vy): x(vx), y(vy) {}};

總結(jié):

C和C++里面的struct還是需要好好理解,一個是面向過程,一個是面向?qū)ο螅褂玫臅r候千萬不要不倫不類。我覺得C++的面向?qū)ο蟮挠梅ū容^合理,C面向過程的用法還是太繁瑣不夠靈活,建議使用倒數(shù)第一和倒是第二種struct代碼風(fēng)格。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 辽宁省| 和田县| 三门峡市| 西峡县| 信宜市| 道真| 涟源市| 西盟| 广昌县| 洪雅县| 扎囊县| 萝北县| 永吉县| 樟树市| 鄱阳县| 吉木萨尔县| 衡阳县| 开化县| 珲春市| 沭阳县| 牟定县| 厦门市| 康乐县| 老河口市| 梨树县| 天台县| 青州市| 福建省| 防城港市| 丹寨县| 平昌县| 松潘县| 大田县| 武安市| 甘肃省| 延安市| 大庆市| 沧州市| 长兴县| 金门县| 金湖县|