最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C++程序中定義struct結構體的方法

 更新時間:2016年05月18日 17:24:48   作者:煙客旅人  
C++中同樣擁有C語言中的結構體,下面就來詳解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代碼風格。

相關文章

  • C語言實現四窗口聊天

    C語言實現四窗口聊天

    這篇文章主要為大家詳細介紹了C語言實現四窗口聊天,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 純C語言:折半查找源碼分享

    純C語言:折半查找源碼分享

    這篇文章主要介紹了純C語言:折半查找源碼,有需要的朋友可以參考一下
    2014-01-01
  • C語言實現歌手大獎賽計分程序

    C語言實現歌手大獎賽計分程序

    這篇文章主要為大家詳細介紹了C語言實現歌手大獎賽計分程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++標準庫封裝的vector數組

    C++標準庫封裝的vector數組

    這篇文章主要介紹了C++標準庫封裝的vector數組,vector創(chuàng)建的對象包含眾多封裝好的函數,想了解其相關資料的小伙伴可以參考下面文章內容,希望對你的學習有所幫助
    2022-03-03
  • Matlab實現灰色預測的示例代碼

    Matlab實現灰色預測的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Matlab實現灰色預測,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2022-05-05
  • 深入解析C++編程中類的封裝特性

    深入解析C++編程中類的封裝特性

    這篇文章主要介紹了深入解析C++編程中類的封裝特性,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C語言實現三子棋游戲(初級版)

    C語言實現三子棋游戲(初級版)

    這篇文章主要為大家詳細介紹了C語言實現三子棋游戲初級版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 詳解C++?的STL迭代器原理和實現

    詳解C++?的STL迭代器原理和實現

    這篇文章主要為大家介紹了C++的STL迭代器原理和實現,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C/C++中getline函數案例總結

    C/C++中getline函數案例總結

    這篇文章主要介紹了C/C++中getline函數案例總結,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • C++中vector的實現方法示例詳解

    C++中vector的實現方法示例詳解

    這篇文章主要介紹了C++中vector實現的相關資料,vector是C++中重要的容器之一,底層通過三個迭代器實現,分別是_start,?_finish,?和_end_of_storage,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10

最新評論

富裕县| 湘阴县| 高淳县| 建水县| 大荔县| 鹤峰县| 怀来县| 迁西县| 天全县| 临沭县| 亚东县| 鄂托克旗| 肥乡县| 衡阳县| 班玛县| 阆中市| 扎鲁特旗| 普安县| 丘北县| 南投市| 同德县| 平遥县| 凉山| 桐庐县| 崇明县| 临高县| 陇西县| 顺义区| 北宁市| 灵寿县| 开封市| 斗六市| 扎鲁特旗| 杭锦后旗| 南投县| 南雄市| 泰来县| 龙川县| 兴海县| 兰溪市| 米易县|