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

詳解c++ 靜態(tài)成員變量

 更新時(shí)間:2020年09月09日 14:28:54   作者:tlanyan  
這篇文章主要介紹了c++ 靜態(tài)成員變量的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

類定義時(shí)的靜態(tài)成員只是聲明,靜態(tài)成員的定義和初始化要在類之外完成

C++的static關(guān)鍵字可修飾類成員變量/方法,表示變量/方法不從屬于特定對象,而是屬于類的。仔細(xì)琢磨靜態(tài)成員變量,會發(fā)現(xiàn)其與C++的方式既相容也矛盾,具有特殊性。

先說相容的一面?!/C++·有聲明和定義的說法:聲明給出簽名,定義給出具體實(shí)現(xiàn)。對類型而言,聲明不一定能知道其對象占用空間大小,但根據(jù)定義肯定能確定內(nèi)存占用。說靜態(tài)成員與C++方式是相容的,因?yàn)槠涑跏蓟绞脚c方法的定義一致。下面是一個(gè)例子:

// Foo.hpp
namespace tlanyan {
 // 類聲明和定義
 class Foo {
 private:
  // 聲明靜態(tài)成員
  static int value;
 public:
  // 方法聲明
  void increaseValue();
  int getValue() const;
 };
}

// Foo.cpp
namespace tlanyan {
 // 定義靜態(tài)成員變量并初始化
 int Foo::value = 0;
 // 類方法定義
 void Foo::increaseValue() {
  ++ value;
 }
 int Foo::getValue() {
  return value;
 }
}

相對于相容點(diǎn),靜態(tài)成員變量更多展現(xiàn)出怪異的一面,以下是個(gè)人總結(jié):

  1. 靜態(tài)成員不能在類中初始化;非靜態(tài)成員可直接初始化,靜態(tài)成員在類中只是聲明,所以不能直接初始化。輔以const的靜態(tài)成員可以直接初始化,但那是const的能力而非static所有;
  2. 對靜態(tài)成員初始化,需要在類之外定義時(shí)再完成;
  3. 初始化時(shí)不受訪問修飾符限制;private類型的靜態(tài)成員可直接訪問并賦值;
  4. 靜態(tài)成員初始化時(shí)可調(diào)用函數(shù),并且可以直接調(diào)用所屬類的私有函數(shù);

其中第4點(diǎn)比較重要。在不支持C++11的編譯器上,要完成靜態(tài)map成員,就不得不借助函數(shù)返回:

#include <map>
// 類定義
class Foo {
private:
 std::map<const char*, int> maps;
 ...
}
// 靜態(tài)成員初始化
std::map<const char*, int> Foo::maps = Foo::initMap();
// 或者使用全局函數(shù)
std::map<const char*, int> Foo::maps = initMap();

C++11引入了統(tǒng)一初始化和lambda表達(dá)式,初始化的寫法更為簡單:

// 統(tǒng)一初始化
std::map<const char*, int> Foo::maps {
 {"a", 31},
 {"b", 32}
};
// lambda表達(dá)式方式
std::map<const char*, int> Foo::maps = [] {
 map<const char*, int> _map;
 _map.insert(map<const char*, int>::value_type("a", 31));
 _map.insert(map<const char*, int>::value_type("a", 32));
 return _map;
}();

靜態(tài)成員的這些異常行為很容易聯(lián)想到全局變量,兩者有許多相通的地方:在程序啟動前完成初始化,在程序終止后銷毀;存放的地方都是靜態(tài)存儲區(qū)而非堆棧;通過名字空間操作符獲取值;在非函數(shù)塊內(nèi)通過函數(shù)調(diào)用或者lambda表達(dá)式完成初始化…

雖然各種面向?qū)ο缶幊陶Z言都有靜態(tài)變量,并且使用比例不低。但從面向?qū)ο蟮慕嵌龋o態(tài)成員是另一種形式的全局變量,其破壞了隔離和封裝,增加了類之間的耦合,讓測試變得更困難。實(shí)際編程中,應(yīng)當(dāng)慎用全局變量,并收緊其訪問權(quán)限。

所以本質(zhì)上靜態(tài)成員也是全局變量,只是歸屬到特定類的名下。

以上就是詳解c++ 靜態(tài)成員變量的詳細(xì)內(nèi)容,更多關(guān)于c++ 靜態(tài)成員變量的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

黔西县| 全南县| 丹东市| 探索| 金平| 中宁县| 高陵县| 玉树县| 尉氏县| 西畴县| 五台县| 视频| 饶河县| 梨树县| 青海省| 浮山县| 姚安县| 宜黄县| 城市| 河池市| 灌南县| 合作市| 利津县| 北辰区| 鹤壁市| 贵溪市| 囊谦县| 友谊县| 渝北区| 芮城县| 邹平县| 岐山县| 手机| 保康县| 桑日县| 灵璧县| 通海县| 沙河市| 肥城市| 中江县| 大埔县|