日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C++空類的那點事兒

來源: 責編: 時間:2023-12-04 17:26:27 246觀看
導讀什么是C++的空類顧名思義,空類就是指哪些不包含成員變量的類。例如以下這個就是一個空類:class EmptyBase {};既然如此,那么是不是說空類的內部一定不會其他代碼呢?不是的,空類內部也可以包含其他東西,例如:構造函數、析構函

ain28資訊網——每日最新資訊28at.com

什么是C++的空類

顧名思義,空類就是指哪些不包含成員變量的類。例如以下這個就是一個空類:ain28資訊網——每日最新資訊28at.com

class EmptyBase {};

既然如此,那么是不是說空類的內部一定不會其他代碼呢?不是的,空類內部也可以包含其他東西,例如:構造函數、析構函數、靜態成員變量、靜態函數、成員函數、typedef語句等。ain28資訊網——每日最新資訊28at.com

例如在以下代碼中EmptyBase依然是空類:ain28資訊網——每日最新資訊28at.com

class EmptyBase {public:    // 構造函數    EmptyBase(){    }    // 析構函數    ~EmptyBase(){    }    // typedef并沒有給類增加成員或者函數    typedef int INT_NUM;        // 不涉及到內部成員變量的內部函數    void set(int a){    }    // 靜態函數    static void setStr(const std::string& s){    }    // 靜態變量    static std::string str;};

在C++11之后我們可以使用std::is_empty判斷一個類是否是空類:ain28資訊網——每日最新資訊28at.com

#include <iostream>class EmptyBase {};int main() {        auto aa = std::is_empty<EmptyBase>::value;    std::cout << "是否是空類:" << aa << std::endl;    return 0;}

C++空類的大小

有以下計算空類大小的代碼,你認為輸出結果是多少?ain28資訊網——每日最新資訊28at.com

#include <iostream>class EmptyClass {    // 空類};int main(int argc, char* argv[]) {    std::cout << "sizeof(EmptyClass): " << sizeof(EmptyClass) << std::endl;    return 0;}

即使是空類,其大小也不會為0。在許多平臺上,空類的大小為1;而在某些對于對齊(alignment)要求更嚴格系統上,空類的大小可能是另一個數(通常是4)。ain28資訊網——每日最新資訊28at.com

為什么C++空類的大小不是0呢?ain28資訊網——每日最新資訊28at.com

C++的設計者們不允許類的大小為0,因為每個對象都必須具有唯一的地址,特別是在涉及到取址和指針計算時,如果一個類的大小是0,那么指針的一切將會失效。 試想一下如果空類的大小為0,那么由空類它們構成的數組,其大小必然也是0,這會導致指針運算中普遍使用的性質失效。ain28資訊網——每日最新資訊28at.com

空基類優化

C++標準規定,當空類作為基類時,只要不會與同一類型的另一個對象或子對象分配在同一地址,就不需為其分配任何空間。ain28資訊網——每日最新資訊28at.com

#include <iostream>class EmptyBase {    // 空基類};class EmptyOne: public EmptyBase{    // 空類1};class EmptyTwo: public EmptyOne{    // 空類2};int main(int argc, char* argv[]) {    std::cout << "sizeof(EmptyBase): " << sizeof(EmptyBase) << std::endl;    std::cout << "sizeof(EmptyOne): " << sizeof(EmptyOne) << std::endl;    std::cout << "sizeof(EmptyTwo): " << sizeof(EmptyTwo) << std::endl;    return 0;}

如果編譯器支持空基類優化,上述程序所有的輸出結果相同(一般是1),但均不為0。ain28資訊網——每日最新資訊28at.com

我們修改一下代碼,將EmptyTwo改為多繼承,那么EmptyTwo還是空類嗎?ain28資訊網——每日最新資訊28at.com

class EmptyTwo: public EmptyOne,public EmptyBase{};

答案是在多繼承狀態的EmptyTwo已經不是空類了, 雖然EmptyTwo和它的基類都沒有任何成員。不過,EmptyTwo的基類EmptyOne和EmptyBase不能分配到同一地址空間, 否則EmptyTwo的基類EmptyBase會和EmptyOne的基類EmptyBase撞在同一地址空間上。換句話說,兩個相同類型的子對象偏移量相同,這是C++對象布局規則不允許的。ain28資訊網——每日最新資訊28at.com

對空基類優化進行限制的根本原因在于,我們需要能比較兩個指針是否指向同一對象。 由于指針幾乎總是用地址作內部表示,所以我們必須保證兩個不同的地址(即兩個不同的指針值)對應兩個不同的對象。 雖然這種約束看起來并不非常重要,但是在實際應用中的許多類都是繼承自一組定義公共typedefs的基類,當這些類作為子對象出現在同一對象中時,問題就凸現出來了,此時優化應被禁止。ain28資訊網——每日最新資訊28at.com

空類存在的意義是什么

盡管在面向對象編程中,空類看起來可能有些多余,但是它們存確有它們的用途。ain28資訊網——每日最新資訊28at.com

空類是一種有著潛在應用價值的編程技巧,例如空類可以被用于多種編程模式和設計模式中,它還可以作為數據類型的標記,用于在編譯時實現條件編譯。 空類也可以作為接口占位符,用于后續的繼承實現或者后續擴展等。空類也在模板編程和元編程等高級編程技術中也發揮重要作用。ain28資訊網——每日最新資訊28at.com

例如在C++標準庫中,五種迭代器類別都有對應的空類。這些空類用于標識迭代器的類別,并通過模板特化來實現對不同類型迭代器的特殊處理,如圖:ain28資訊網——每日最新資訊28at.com

ain28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-37672-0.htmlC++空類的那點事兒

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 開發者必備的五類AI工具,不容錯過!

下一篇: C++構造函數:初始化對象成員變量的關鍵

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 营山县| 轮台县| 金溪县| 太仓市| 永州市| 江油市| 建始县| 乌审旗| 贵德县| 普宁市| 寿阳县| 射洪县| 简阳市| 龙游县| 蒙阴县| 康马县| 焉耆| 田阳县| 布拖县| 日照市| 梅州市| 蓝山县| 屏南县| 闵行区| 黄山市| 三河市| 乡宁县| 泾源县| 攀枝花市| 兖州市| 郧西县| 武乡县| 清水县| 巩义市| 隆德县| 左权县| 常州市| 沂源县| 榆中县| 左云县| 商水县|