国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

代碼保鏢上線!C++11 三劍客 (nullptr、override、final) 如何拯救你的程序

開發
天就帶大家看看 C++11 是如何用三個超實用的新特性——nullptr、override和final,讓你的代碼不再"裸奔"!

大家好啊,我是小康。

今天咱不講大道理,就聊點實在的——你有沒有被一個討厭的小東西折磨過?沒錯,就是那個臭名昭著的空指針( NULL )!還有那些繼承來繼承去卻不知道自己到底覆蓋沒覆蓋父類方法的尷尬事?

如果你點頭了,那這篇文章絕對是為你量身定做的!今天就帶大家看看 C++11 是如何用三個超實用的新特性——nullptr、override和final,讓你的代碼不再"裸奔"!

nullptr:別再用 0 和 NULL 裝空指針了!

還記得那些深夜調試的恐怖時刻嗎?你滿心歡喜地寫下:

void process(int value) {
    std::cout << "處理整數: " << value << std::endl;
}

void process(char* str) {
    if (str)
        std::cout << "處理字符串: " << str << std::endl;
    else
        std::cout << "空字符串" << std::endl;
}

int main() {
    process(0);       // 猜猜調用哪個?
    process(NULL);    // 這個呢?
}

你以為第二個會調用字符串版本的函數?天真!在大多數編譯器中,這兩個調用都會選擇process(int),因為NULL通常就是個被定義為 0 的宏!這么多年來,C++程序員一直在踩這個坑。

C++11終于看不下去了,推出了專門表示空指針的nullptr:

process(nullptr);  // 保證調用process(char*)

nullptr是一個特殊的類型(std::nullptr_t),它可以隱式轉換為任何指針類型,但不會轉換為整數類型。這就巧妙地解決了函數重載時的歧義問題。

我們再來看個更貼近日常開發的例子,看看nullptr是如何幫我們寫出更健壯代碼的:

// 以前我們可能會這樣寫一個查找用戶的函數
User* findUser(int id) {
    // 假設找不到用戶時
    return NULL; // 或者return 0;
}

// 調用和檢查
User* user = findUser(123);
if (user == NULL) { // 或者if (user == 0)
    // 處理未找到用戶的情況
}

// 使用nullptr后
User* findUserBetter(int id) {
    // 找不到用戶時
    return nullptr;
}

// 調用和檢查
User* user = findUserBetter(123);
if (user == nullptr) {
    // 代碼意圖更加明確,我們確實在檢查"空指針"
}

甚至可以在各種智能指針場景下使用:

std::shared_ptr<User> findSharedUser(int id) {
    // 找不到用戶
    return nullptr; // 返回一個空的shared_ptr
}

auto user = findSharedUser(123);
if (!user) { // 智能指針可以直接用在條件判斷中
    std::cout << "用戶不存在" << std::endl;
}

看,使用nullptr不僅讓代碼意圖更明確(我們確實是在處理"空指針"而不是數字0),還能與現代 C++ 的智能指針完美配合!

override:我真的重寫了父類方法,不是COS!

繼承是面向對象的核心概念,但也是 bug 的溫床。問題在哪呢?看這個例子:

class Animal {
public:
    virtual void makeSound() {
        std::cout << "某種動物叫聲" << std::endl;
    }
    
    virtual void eat(const char* food) {
        std::cout << "動物在吃: " << food << std::endl;
    }
};

class Dog :public Animal {
public:
    // 重寫父類方法
    void makeSound() {
        std::cout << "汪汪汪!" << std::endl;
    }
    
    // 哎呀,打錯字了
    void eat(const std::string& food) {
        std::cout << "狗狗在吃: " << food << std::endl;
    }
};

你發現問題了嗎?Dog::eat方法的參數類型和父類不同,這不是重寫,而是一個全新的方法!當你調用dog->eat("骨頭")時,如果dog是一個Animal*類型的指針,它會調用Animal::eat而不是Dog::eat。

太坑了!這種微妙的錯誤甚至不會被編譯器發現。

C++11的override關鍵字來拯救你了:

class Dog : public Animal {
public:
    // 顯式聲明這是重寫
    void makeSound() override {
        std::cout << "汪汪汪!" << std::endl;
    }
    
    // 編譯器會報錯!因為參數類型不匹配
    void eat(const std::string& food) override {
        std::cout << "狗狗在吃: " << food << std::endl;
    }
};

有了override,如果你不小心寫錯了方法名、參數類型、返回類型,或者父類方法根本就不是虛函數,編譯器會立刻報錯,幫你抓住這些討厭的 bug!

final:到此為止,別再繼承了!

有時候,我們設計一個類或方法時,希望它是最終版,不允許任何人再繼承或重寫。C++11之前,只能靠注釋和文檔來"警告"其他程序員,但這并不是強制性的。

現在,final關鍵字給了我們一個硬性規定的能力:

class Shape {
public:
    virtual void draw() = 0;
};

class Circle :public Shape {
public:
    // 這個方法不允許在子類中重寫
    void draw() override final {
        std::cout << "畫一個圓" << std::endl;
    }
};

// 可以繼承Circle
class ColoredCircle :public Circle {
public:
    // 錯誤:不能重寫final方法
    void draw() override {
        std::cout << "畫一個彩色的圓" << std::endl;
    }
};

final還可以應用到整個類上,禁止任何繼承:

// 此類不能被繼承
class Singleton final {
private:
    static Singleton* instance;
    
    Singleton() {}
    
public:
    static Singleton* getInstance() {
        if (!instance)
            instance = new Singleton();
        return instance;
    }
};

// 錯誤:不能繼承final類
class DerivedSingleton :public Singleton {
};

使用final可以明確表達你的設計意圖,防止其他人誤用你的類,同時也有助于編譯器進行優化。

實戰:三劍客聯手保平安

讓我們來看一個綜合的例子,展示這三個特性如何協同工作:

class Logger {
public:
    virtual bool init(const char* filename = nullptr) {
        std::cout << "基礎日志初始化" << std::endl;
        return true;
    }
    
    virtual void log(const char* message) = 0;
    
    virtual ~Logger() {}
};

class FileLogger final :public Logger {
private:
    bool isOpen;
    
public:
    FileLogger() : isOpen(false) {}
    
    bool init(const char* filename = nullptr) override {
        if (!filename)
            returnfalse;
            
        std::cout << "文件日志初始化: " << filename << std::endl;
        isOpen = true;
        return isOpen;
    }
    
    void log(const char* message) override {
        if (isOpen && message != nullptr)
            std::cout << "寫入日志: " << message << std::endl;
    }
};

int main() {
    Logger* logger = new FileLogger();
    
    // 正確使用nullptr
    if (!logger->init(nullptr)) {
        logger->init("app.log");
    }
    
    // 安全地傳遞nullptr
    logger->log(nullptr);
    logger->log("程序啟動");
    
    delete logger;
}

在這個例子中:

  • nullptr確保我們安全地處理空指針
  • override確保我們正確地重寫了基類方法
  • final防止有人繼承我們的FileLogger類

總結:小改變,大提升

C++11的這三個小特性看似簡單,卻能極大地提高代碼的安全性和可維護性:

  • nullptr:專門的空指針常量,避免與整數 0 混淆
  • override:明確表明意圖,防止意外創建新方法而非重寫
  • final:表達設計意圖,防止不當繼承或重寫

這些改進都體現了 C++11 的一個核心理念:讓編譯器幫我們發現更多錯誤,在編譯時而非運行時捕獲問題。

對于老代碼,我強烈建議逐步遷移到這些新特性。特別是override,幾乎沒有理由不使用它——它不會改變任何運行時行為,只會讓編譯器幫你捉 bug。

下次當你寫下:

void someFunction(SomeClass* ptr = nullptr) override final {
    // 實現...
}

別忘了,你已經讓你的代碼比以前安全了許多!

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2011-03-28 16:04:44

nagios

2010-02-04 16:22:21

2019-06-27 10:06:54

Linux 性能工具

2023-10-04 00:20:31

grepLinux

2017-07-25 08:53:14

CorrectLinkCCA-SD算法

2024-06-04 00:20:00

Python函數

2009-02-26 18:22:49

桌面虛擬化Linux

2019-08-20 14:29:45

grepsedawk

2021-05-13 10:25:29

Linuxgrep命令

2014-11-26 10:18:32

Cloud Setupwindows在線打包工具

2018-05-04 15:18:01

DockerDocker Comp容器

2021-03-15 07:39:48

LinuxAwk 語言

2011-07-04 09:07:54

2011-04-11 11:01:03

AndroidHTC蘋果

2009-03-19 20:52:58

LinuxPHPCMS

2011-08-06 23:58:34

愛普生投影機

2023-11-25 17:08:47

ChatbotLLAMALangChain

2025-04-22 09:39:46

Python爬蟲網頁數據抓取

2024-05-29 13:21:21

2022-03-03 15:15:27

大數據數據湖技術
點贊
收藏

51CTO技術棧公眾號

在线国产中文字幕| 日韩视频一区二区在线观看| aaaaa毛片| 日韩精品一区二区三区swag| 亚洲伊人影院| 农村寡妇一区二区三区| 国产mv日韩mv欧美| 一个人看的www一区| 亚洲色图五月天| 欧美gayvideo| 欧美成人免费在线观看视频| 午夜精品久久久久久久蜜桃app| 国产色播av在线| 国产精品永久免费在线| 国产成人午夜高潮毛片| 欧美日韩视频精品二区| 超薄丝袜一区二区| 久久久久免费| 亚洲男男gay视频| 色综合伊人色综合网| 亚洲国产高清一区| 99免费看香蕉视频| 中文字幕欧美日韩精品| 亚洲一区日韩在线| 日韩黄色网址| 欧美黑人xxxx| 韩国av一区二区三区四区| 第一福利在线| 国产成人精品视| 成人免费毛片app| 免费在线国产视频| 成人av免费在线看| 一区二区三区.www| 日本成人精品| 无码日本精品xxxxxxxxx| 91精品欧美一区二区三区综合在| 成人三级视频| 国产美女av| 欧美成人黄色小视频| 国产精品一区二区三区99| а天堂中文在线官网| 99在线免费观看视频| 亚洲午夜精品久久久久久久久| 一区二区在线免费播放| 毛片在线视频播放| 亚洲天堂av在线播放| 日本中文在线一区| av片在线观看网站| 久久99精品久久久久久水蜜桃 | 91最新在线观看| 亚洲欧美www| 美女视频一区二区三区| 成码无人av片在线观看网站| 高清视频一区| 在线精品视频小说1| 日韩a一区二区| 波多野结衣在线| 国产精品久久久久久久久久ktv | 国内精品国产成人国产三级粉色| 大肉大捧一进一出好爽视频| 最近2019免费中文字幕视频三| 国模无码大尺度一区二区三区| 久草在线视频福利| 亚洲精品无人区| 亚洲国产精久久久久久久| 免费成人av在线播放| 嗯啊主人调教在线播放视频 | 日韩在线视频观看正片免费网站| 岛国精品一区二区| 亚洲网站免费| 成人在线观看a| 992tv在线成人免费观看| 成人欧美一区二区三区| 色综合中文网| 欧美xxx.com| 免费观看成人在线| 亚洲美女精品成人在线视频| 不卡一区二区在线| 成人爽a毛片| 日本aa大片在线播放免费看| 91老司机在线| 日韩视频免费观看高清完整版| 国产麻豆精品theporn| 亚洲三级av| 色哟哟在线观看| 日本午夜精品一区二区| 在线日韩日本国产亚洲| 国产精品免费视频一区| 成人在线免费视频观看| 国产午夜在线视频| 国产高清精品软男同| 欧美激情亚洲国产| 亚洲va中文字幕| 久久香蕉精品| 国产日韩欧美中文在线| 中文在线观看视频| 日韩精品不卡| 不卡av日日日| 天天操天天干天天综合网| 久久久久在线| 午夜视频一区二区在线观看| 色哟哟在线观看| 亚洲成年人专区| 国语自产精品视频在线看一大j8| 精品人伦一区二区三区蜜桃免费| 三级不卡在线观看| 精品国产乱码久久久久久樱花| 又黄又爽在线观看| 亚洲精品人成| 4438全国成人免费| 欧美高清视频一二三区| 不卡的av在线| 亚洲综合色网| 欧美日韩伦理一区二区| 色综合888| 97国产精东麻豆人妻电影| 91超碰在线免费观看| 在线成人激情视频| 日韩欧美在线看| 国产·精品毛片| 欧美顶级大胆免费视频| 久久电影tv| 香蕉97视频观看在线观看| 亚洲高潮无码久久| 成人www视频在线观看| 亚洲欧美精品一区二区| 欧美日韩国产影院| 99精品视频在线播放观看| 国产精品大片免费观看| 1204国产成人精品视频| 都市激情久久综合| 影音先锋可以看的网站| 日本一区二区免费高清视频| 国产欧美精品一区二区| 久久精品国产一区| 日韩精品一区二区三区四区视频| 一区二区在线观看视频| 国内不卡的二区三区中文字幕| 久久神马影院| 成人亚洲精品| 免费在线观看av片| caoliu在线| 国产3p露脸普通话对白| 蜜桃精品久久久久久久免费影院| 91精品国产高清自在线看超| 亚洲男人7777| 欧美二区在线观看| 亚洲曰韩产成在线| 99久久伊人久久99| 日本va欧美va欧美va精品| 久久精品免费一区二区三区| 成人三级毛片| 麻豆久久久久| 成年人在线网站| 日本在线观看视频| 亚洲有码转帖| 国产视频1区2区3区| 成人国产一区二区三区| 久久精彩视频| 91一区二区三区| 日韩女优人人人人射在线视频| 自拍偷拍亚洲区| 欧美不卡一区二区三区四区| 色伊人久久综合中文字幕| 亚洲美女淫视频| 中文字幕 久热精品 视频在线| 丁香婷婷深情五月亚洲| 老司机一区二区| 天堂在线一区二区| 亚洲精选在线| 亚洲成人精选| 日韩在线不卡| 久久91精品| 欧美电影在线观看免费| 日韩欧美三区| 51一区二区三区| 欧美美女日韩| 欧洲成人综合网| huan性巨大欧美| 免费看美女视频在线网站| 国模吧精品人体gogo| 涩爱av在线播放一区二区| 中文视频在线| 人成免费电影一二三区在线观看| 在线看片免费人成视久网| 香蕉视频在线网站| qvod激情图片| 美女激情网站| 羞羞网站免费观看| 男女小视频在线观看| 好男人社区在线视频| 女人黄色片免费| 一级毛片免费观看| 开心丁香婷婷深爱五月| 毛片网站大全| 同心难改在线观看| av基地在线| 2021天堂中文幕一二区在线观| 亚洲三级欧美| 久久免费资源|