亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

詳解C++編程中類的成員變量和成員函數的相關知識

2020-01-26 14:52:23
字體:
來源:轉載
供稿:網友

C++類的成員變量和成員函數
類是一種數據類型,它類似于普通的數據類型,但是又有別于普通的數據類型。類這種數據類型是一個包含成員變量和成員函數的一個集合。

類的成員變量和普通變量一樣,也有數據類型和名稱,占用固定長度的內存空間。但是,在定義類的時候不能對成員變量賦值,因為類只是一種數據類型,本身不占用內存空間,而變量的值則需要內存來存儲。

類的成員函數也和普通函數一樣,都有返回值和參數列表,它與一般函數的區別是:成員函數是一個類的成員,出現在類體中,它的作用范圍由類來決定;而普通函數是獨立的,作用范圍是全局的,或位于某個命名空間內。

上節我們在最后的完整示例中給出了 Student 類的定義,如下所示:

class Student{public: //類包含的變量  char *name;  int age;  float score;public: //類包含的函數  void say(){    printf("%s的年齡是 %d,成績是 %f/n", name, age, score);  }};上面的代碼在類體中定義了成員函數。你也可以只在類體中聲明函數,而將函數定義放在類體外面,如下圖所示:class Student{public:  char *name;  int age;  float score;public:  void say(); //函數聲明};//函數定義void Student::say(){  printf("%s的年齡是 %d,成績是 %f/n", name, age, score);}

在類體中直接定義函數時,不需要在函數名前面加上類名,因為函數屬于哪一個類是不言而喻的。

但當成員函數定義在類外時,就必須在函數名前面加上類名予以限定。::被稱為域解析符(也稱作用域運算符或作用域限定符),用來連接類名和函數名,指明當前函數屬于哪個類。

如果在域解析符“::”的前面沒有類名,或者函數名前面既無類名又無域解析符“::”,如:

//無類名::say( ){  //TODO}//無類名也無域解析符say( ){  //TODO}


則表示 say() 函數不屬于任何類,這個函數不是成員函數,而是全局函數,即非成員函數的一般普通函數。

成員函數必須先在類體中作原型聲明,然后在類外定義,也就是說類體的位置應在函數定義之前,否則編譯時會出錯。

雖然成員函數在類的外部定義,但在調用時會根據在類中聲明的函數原型找到函數的定義(函數代碼),從而執行該函數。
inline 成員函數

在類體中和類體外定義成員函數是有區別的:在類體中定義的成員函數為內聯(inline)函數,在類體外定義的不是。

內聯函數一般不是我們所期望的,它會將函數調用處用函數體替代,所以我建議在類體內部對成員函數作聲明,而在類體外部進行定義,這是一種良好的編程習慣。

當然,如果你的函數比較短小,希望定義為內聯函數,那也沒有什么不妥的。

如果你既希望將函數定義在類體外部,又希望它是內聯函數,那么可以在聲明函數時加 inline 關鍵字,如下所示:

class Student{public:  char *name;  int age;  float score;public:  inline void say(); //聲明為內聯函數};//函數定義void Student::say(){  printf("%s的年齡是 %d,成績是 %f/n", name, age, score);}

這樣,say() 就會變成內聯函數。
在類體內部定義的函數也可以加 inline 關鍵字,但這是多余的,因為類體內部定義的函數默認就是內聯函數。
值得注意的是,如果在類體外定義 inline 函數,則必須將類定義和成員函數的定義都放在同一個頭文件中(或者寫在同一個源文件中),否則編譯時無法進行嵌入(將函數代碼的嵌入到函數調用出)。這樣做雖然提高了程序的執行效率,但從軟件工程質量的角度來看,這樣做并不是好的辦法,因此實際開發中較少在類中使用內聯函數。

C++提出內聯函數的主要用意是:用內聯函數取代帶參宏定義(函數傳參比宏更加方便易用),而不是提高程序運行效率,因為與執行函數花費的時間相比,調用函數花費的時間往往微乎其微。

C++成員函數的存儲方式
用類去定義對象時,系統會為每一個對象分配存儲空間。如果一個類包括了數據和函數,要分別為數據和函數的代碼分配存儲空間。

按理說,如果用同一個類定義了10個對象,那么就需要分別為10個對象的數據和函數代碼分配存儲單元,如下圖所示。

能否只用一段空間來存放這個共同的函數代碼段,在調用各對象的函數時,都去調用這個公用的函數代碼。如圖所示。

顯然,這樣做會大大節約存儲空間。C++編譯系統正是這樣做的,因此每個對象所占用的存儲空間只是該對象的數據部分所占用的存儲空間,而不包括函數代碼所占用的存儲空間。如果聲明了一個類:

class Time{  public:  int hour;  int minute;  int sec;  void set( )  {   cin>>a>>b>>c;  }};

可以用下面的語句來輸出該類對象所占用的字節數:

  cout<<sizeof(Time)<<endl;


輸出的值是12。

這就證明了一個對象所占的空間大小只取決于該對象中數據成員所占的空間,而與成員函數無關。

函數代碼是存儲在對象空間之外的。如果對同一個類定義了10個對象,這些對象的成員函數對應的是同一個函數代碼段,而不是10個不同的函數代碼段。需要注意的是,雖然調用不同對象的成員函數時都是執行同一段函數代碼,但是執行結果一般是不相同的。

不同的對象使用的是同一個函數代碼段,它怎么能夠分別對不同對象中的數據進行操作呢?

原來C++為此專門設立了一個名為this的指針,用來指向不同的對象。需要說明:
不論成員函數在類內定義還是在類外定義,成員函數的代碼段都用同一種方式存儲。
不要將成員函數的這種存儲方式和inMne(內置)函數的概念混淆。不要誤以為用inline聲明(或默認為inline)的成員函數,其代碼段占用對象的存儲空間,而不用 inline聲明的成員函數,其代碼段不占用對象的存儲空間。不論是否用inline聲明,成員函數的代碼段都不占用對象的存儲空間。用inline聲明的作用是在調用該函數時,將函數的代碼段復制插人到函數調用點,而若不用inline聲明,在調用該函數時,流程轉去函數代碼段的人口地址,在執行完該函數代碼段后,流程返回函數調用點。inline與成員函數是否占用對象的存儲空間無關,它們不屬同一個問亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

色偷偷亚洲男人天堂| 亚洲片国产一区一级在线观看| 亚洲人成网站999久久久综合| 久久国产加勒比精品无码| 伊人久久男人天堂| 国产精品美腿一区在线看| 国产suv精品一区二区三区88区| 国产精品video| 国产亚洲精品美女| 欧美电影免费观看电视剧大全| 2019最新中文字幕| 亚洲国产天堂网精品网站| 136fldh精品导航福利| xxxx性欧美| 一本色道久久88综合亚洲精品ⅰ| 国产成人欧美在线观看| 亚洲人成网站在线播| 伊人久久精品视频| 日韩av男人的天堂| 亚洲精品资源美女情侣酒店| 亚洲第一福利在线观看| 国产精品 欧美在线| 欧美日韩成人黄色| 欧美肥老太性生活视频| 日韩精品有码在线观看| 97香蕉久久超级碰碰高清版| 亚洲品质视频自拍网| 国产成人精品日本亚洲| 国产a∨精品一区二区三区不卡| 久热精品视频在线| 黑人狂躁日本妞一区二区三区| 91精品免费视频| 久热精品在线视频| 欧美老少配视频| 最近2019中文免费高清视频观看www99| 欧美成人免费播放| 亚洲第一av网站| 91性高湖久久久久久久久_久久99| 日韩欧美高清视频| 亚洲欧美中文日韩在线v日本| 91影院在线免费观看视频| 欧美日韩国产精品专区| 国产一区二区三区网站| 国产成人精品免费久久久久| 国产狼人综合免费视频| 九九九久久国产免费| 国产精品亚洲综合天堂夜夜| 日韩成人网免费视频| 国产亚洲精品成人av久久ww| 18久久久久久| 91免费在线视频网站| 不卡毛片在线看| 亚洲激情中文字幕| 午夜精品久久久久久久白皮肤| 亚洲第一网站免费视频| 国内免费久久久久久久久久久| 亚洲第一偷拍网| 欧美专区在线播放| 欧美福利小视频| 97免费视频在线播放| 久久亚洲精品一区| 久久久精品免费视频| 亚洲影院色无极综合| 欧美视频裸体精品| 日韩av电影在线播放| 国产综合在线视频| 在线日韩日本国产亚洲| 中国日韩欧美久久久久久久久| 国产综合香蕉五月婷在线| 2019亚洲日韩新视频| 日韩欧美成人区| 超碰97人人做人人爱少妇| 97人洗澡人人免费公开视频碰碰碰| 欧美午夜片在线免费观看| 欧美国产日产韩国视频| 国模私拍视频一区| 欧美激情视频网站| 黄色成人在线播放| 中文在线资源观看视频网站免费不卡| 中文字幕在线观看亚洲| 国产精品久久久久久久一区探花| 国产成人97精品免费看片| 日韩av在线免费播放| 日韩精品极品在线观看| 亚洲精品xxxx| 欧美精品中文字幕一区| 亚洲深夜福利视频| 97av在线播放| 精品人伦一区二区三区蜜桃免费| 亚洲国产精彩中文乱码av在线播放| 92看片淫黄大片欧美看国产片| 亚洲视频在线视频| 伊人亚洲福利一区二区三区| 欧美一区第一页| 久久久99久久精品女同性| 日韩亚洲欧美中文在线| 97国产真实伦对白精彩视频8| 国模吧一区二区| 97成人超碰免| 日韩视频第一页| 草民午夜欧美限制a级福利片| 国产一区二区视频在线观看| 国产日产亚洲精品| 亚洲视频电影图片偷拍一区| 欧美电影在线观看网站| 成人黄色免费片| 91久久精品国产91久久| 日本精品性网站在线观看| 国产精品手机播放| 都市激情亚洲色图| 欧美精品久久久久久久久| 91精品久久久久久久久不口人| 国产精品久久久久久久久男| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品三级网站| 欧美黑人性生活视频| 欧美裸体xxxx极品少妇软件| 国产综合久久久久久| 亚洲自拍在线观看| 久久精品中文字幕免费mv| 国产丝袜一区二区| 国产精品一区久久| 亚洲成年网站在线观看| 亚洲精品福利视频| 91色琪琪电影亚洲精品久久| 日韩电影免费在线观看中文字幕| 国产91色在线|| 中文日韩在线观看| 成人激情视频在线观看| 91久久久久久国产精品| 国产欧美亚洲精品| 国产欧美va欧美va香蕉在| 国产精品27p| 欧美成人免费va影院高清| 91麻豆国产精品| 国产97在线亚洲| 久久噜噜噜精品国产亚洲综合| 日韩精品极品毛片系列视频| 亚洲男女性事视频| 最近2019年日本中文免费字幕| 亚洲最大的免费| 午夜精品久久久久久久久久久久久| 亚洲欧洲成视频免费观看| 久久成人免费视频| 亚洲电影天堂av| 有码中文亚洲精品| 亚洲91精品在线观看| 国产亚洲一区二区精品| 国产a级全部精品| 国产成人在线播放| 精品久久久国产精品999| 亚洲第一av网| 91精品国产乱码久久久久久久久| 国产精品揄拍500视频| 欧美日韩国产综合视频在线观看中文| 97人人模人人爽人人喊中文字| 亚洲男人第一av网站| 精品亚洲夜色av98在线观看| 国产精品免费观看在线| 在线精品国产成人综合| 精品综合久久久久久97| 国内精品久久久久久中文字幕| 日本中文字幕不卡免费| 国产精欧美一区二区三区|