自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++ 默認(rèn)參數(shù) vs 函數(shù)重載,怎么選才對(duì)?

開發(fā)
讓我們一起來探索如何在實(shí)際開發(fā)中優(yōu)雅地使用默認(rèn)參數(shù),就像調(diào)配一杯完美的奶茶一樣精準(zhǔn)和令人愉悅。

想象你正在點(diǎn)一杯奶茶...

"老板,我要一杯珍珠奶茶!" "要調(diào)整糖度和冰量嗎?" "不用了,默認(rèn)的就好!"

這個(gè)場(chǎng)景是不是很熟悉?在編程世界里,C++ 的默認(rèn)參數(shù)就像奶茶店的"標(biāo)配"一樣 - 如果顧客沒有特別要求,我們就按照默認(rèn)配置來制作。這不僅讓點(diǎn)單變得簡(jiǎn)單,還能滿足不同顧客的需求!

就像奶茶可以調(diào)整糖度和冰量,函數(shù)的參數(shù)也可以有默認(rèn)值。當(dāng)我們調(diào)用函數(shù)時(shí),如果覺得默認(rèn)值剛剛好,就可以直接使用;如果想要"調(diào)整口味",也可以輕松覆蓋這些默認(rèn)值。這種靈活性,讓我們的代碼既簡(jiǎn)潔又實(shí)用!

讓我們一起來探索如何在實(shí)際開發(fā)中優(yōu)雅地使用默認(rèn)參數(shù),就像調(diào)配一杯完美的奶茶一樣精準(zhǔn)和令人愉悅~

默認(rèn)參數(shù) vs 函數(shù)重載: 如何做出明智的選擇? 

想象你在開一家餐廳,顧客點(diǎn)了一杯奶茶 ??。有些顧客喜歡調(diào)整糖度和冰量,有些則完全接受默認(rèn)配置。作為老板的你,會(huì)怎么設(shè)計(jì)點(diǎn)單系統(tǒng)呢?

讓我們看看第一種方案 - 使用默認(rèn)參數(shù):

// ?? 奶茶制作函數(shù) - 就像一個(gè)神奇的奶茶機(jī)! 
void makeMilkTea(
    const string& type,    // ?? 奶茶類型(珍珠/椰果/...)
    int sugar = 100,      // ?? 甜度(默認(rèn)100%全糖,甜蜜蜜~)
    int ice = 100         // ?? 冰量(默認(rèn)100%全冰,超爽的!)
) {
    // ?? 制作奶茶的神奇過程:
    // 1. ?? 先煮好茶底
    // 2. ?? 加入牛奶
    // 3. ?? 按比例加糖
    // 4. ?? 最后加冰
    // ... 具體實(shí)現(xiàn)邏輯 ...
}

這樣顧客就可以這樣點(diǎn)單:

// ?? 不同的點(diǎn)單方式展示
makeMilkTea("珍珠奶茶");                  // ?? 標(biāo)配奶茶 - 全糖全冰,就是這么簡(jiǎn)單!
makeMilkTea("珍珠奶茶", 50);             // ?? 調(diào)整甜度 - 半糖全冰,適合減糖人士~
makeMilkTea("珍珠奶茶", 50, 0);          // ?? 完全客制 - 半糖去冰,夏天照樣喝!

// ?? 小貼士:
// - 參數(shù)越往右,自由度越高
// - 默認(rèn)值讓代碼更簡(jiǎn)潔優(yōu)雅
// - 就像點(diǎn)奶茶一樣靈活多變!

再來看看第二種方案 - 使用函數(shù)重載:

// ?? 奶茶制作系列函數(shù) - 為不同的顧客提供貼心服務(wù)!

// 簡(jiǎn)單版本 - 給喜歡默認(rèn)配置的顧客 ??
void makeMilkTea(const string& type) {
    makeMilkTea(type, 100, 100);  // ?? 全糖全冰,經(jīng)典口味!
}

// 升級(jí)版本 - 給想調(diào)整糖度的顧客 ??
void makeMilkTea(const string& type, int sugar) {
    makeMilkTea(type, sugar, 100);  // ?? 可調(diào)糖度,保持全冰
}

// 終極版本 - 給追求完全客制化的顧客 ?
void makeMilkTea(const string& type, int sugar, int ice) {
    // ?? 奶茶制作的藝術(shù)流程:
    // 1. ?? 先準(zhǔn)備茶底
    // 2. ?? 加入新鮮牛奶
    // 3. ?? 按照指定糖度調(diào)配
    // 4. ?? 最后加入冰塊
    // ... 具體實(shí)現(xiàn)邏輯 ...
}

// ?? 小貼士:
// - 這種寫法雖然能工作,但不如使用默認(rèn)參數(shù)優(yōu)雅
// - 建議重構(gòu)成單個(gè)帶默認(rèn)參數(shù)的函數(shù)
// - 讓代碼更簡(jiǎn)潔,更容易維護(hù)! ?

哪種方案更好呢? 

默認(rèn)參數(shù)方案就像是一個(gè)"一站式"服務(wù)窗口,只需要一個(gè)函數(shù)就能處理所有情況。而函數(shù)重載則像是開了多個(gè)窗口,每個(gè)窗口處理不同的點(diǎn)單方式。

使用默認(rèn)參數(shù)的優(yōu)勢(shì)在于:

  • 代碼更簡(jiǎn)潔,不需要重復(fù)編寫類似的函數(shù)
  • 意圖更明確,一眼就能看出參數(shù)的默認(rèn)值
  • 維護(hù)更容易,修改默認(rèn)值只需要改一處

不過有時(shí)候函數(shù)重載也是必需的,比如處理不同類型的參數(shù)時(shí):

// ??? 打印函數(shù)家族 - 每個(gè)成員都有自己的特長(zhǎng)!

void print(int x);        // ?? 整數(shù)打印專家 - 1, 2, 3 輕松搞定!
void print(double x);     // ?? 小數(shù)打印達(dá)人 - 3.14159 就交給我!
void print(const string& s); // ?? 字符串打印高手 - "Hello World" 不在話下!

// ?? 小貼士:
// - 這是函數(shù)重載的經(jīng)典應(yīng)用場(chǎng)景
// - 每個(gè)函數(shù)處理不同類型的數(shù)據(jù)
// - 讓代碼更直觀、更優(yōu)雅! ?

這種情況下,由于參數(shù)類型不同,我們就只能使用函數(shù)重載啦! 

記住: 如果你的函數(shù)只是在處理相同類型的可選參數(shù),默認(rèn)參數(shù)通常是更好的選擇。就像我們的奶茶店,用一個(gè)窗口就能滿足所有客人的需求,何必要開三個(gè)呢? 

實(shí)施建議

如果你在代碼審查中發(fā)現(xiàn)類似這樣的重載函數(shù):

// ?? 不推薦這樣寫 - 代碼重復(fù)且難維護(hù)
void configure(const string& name);                          // 基礎(chǔ)版本
void configure(const string& name, int version);            // 加入版本號(hào)
void configure(const string& name, int version, bool debug); // 再加調(diào)試模式

建議重構(gòu)為使用默認(rèn)參數(shù)的方式:

// ? 推薦這樣寫 - 使用默認(rèn)參數(shù),簡(jiǎn)潔優(yōu)雅!
void configure(
    const string& name,     // ?? 配置名稱(必填)
    int version = 1,        // ?? 版本號(hào)(默認(rèn)v1)
    bool debug = false      // ?? 調(diào)試模式(默認(rèn)關(guān)閉)
);

// ?? 使用示例:
// configure("myapp");                // ?? 使用全部默認(rèn)值
// configure("myapp", 2);             // ?? 指定新版本
// configure("myapp", 2, true);       // ?? 開啟調(diào)試模式

優(yōu)勢(shì):

  • 代碼更簡(jiǎn)潔,不需要重復(fù)定義
  • 參數(shù)含義一目了然
  • 維護(hù)更方便,只需修改一處
  • IDE提示更友好

默認(rèn)參數(shù)的注意事項(xiàng)

1. 默認(rèn)參數(shù)的黃金法則 - 從右向左排隊(duì)! 

想象參數(shù)們?cè)谂抨?duì)買奶茶,默認(rèn)參數(shù)只能乖乖地從右邊開始排隊(duì),不能插隊(duì)! ??

// 這樣排隊(duì)是對(duì)的! ?
void setConfig(string name, int port = 8080, bool debug = false);

就像排隊(duì)買奶茶一樣,最右邊的同學(xué)(debug)先說"我要默認(rèn)配置!",然后是port說"我也要默認(rèn)值!" 

但是如果這樣排隊(duì):

// 這樣可不行哦~ ??
void setConfig(string name, int port = 8080, bool debug);

編譯器小警察就會(huì)生氣了! 因?yàn)閐ebug同學(xué)沒有默認(rèn)值,卻讓port同學(xué)有默認(rèn)值,這是在插隊(duì)啊!

2. 小心默認(rèn)參數(shù)的雙重聲明陷阱!

哎呀,默認(rèn)參數(shù)就像是個(gè)調(diào)皮的小精靈,它可不喜歡被重復(fù)聲明呢!

先看看頭文件里怎么寫:

// 頭文件中 (.h)
class Database {
public:
    void connect(const string& host, int port = 3306); // 默認(rèn)值在這里說一次就夠啦! ??
};

再看看源文件:

// 源文件中 (.cpp)
void Database::connect(const string& host, int port) { // 這里就不要重復(fù)默認(rèn)值啦! ??
    // 實(shí)現(xiàn)代碼
}

為什么要這樣呢?因?yàn)椋?/p>

  • 默認(rèn)值只需要在一個(gè)地方聲明,就像蛋糕只需要一個(gè)配方就夠啦!
  • 重復(fù)聲明容易導(dǎo)致不一致,就像兩個(gè)廚師各自加糖,那蛋糕不就太甜啦?
  • 如果要改默認(rèn)值,只需要改頭文件一個(gè)地方,多簡(jiǎn)單!

記?。耗J(rèn)參數(shù)是個(gè)害羞的小可愛,說一次就夠啦,不要老是重復(fù)哦!

3. 小心!可變默認(rèn)參數(shù)是個(gè)調(diào)皮鬼! 

哎呀,默認(rèn)參數(shù)也有調(diào)皮的時(shí)候呢~ 來看看這個(gè)淘氣包:

// 危險(xiǎn)動(dòng)作!千萬別這樣做 ??
void processData(vector<int>& data, vector<int>& cache = {}) {
    // 每次調(diào)用都會(huì)偷偷創(chuàng)建新的 vector,好浪費(fèi)啊! 
}

這就像每次點(diǎn)奶茶都要重新買一個(gè)新杯子,多浪費(fèi)啊!

來看看乖寶寶的寫法:

// 這才是乖孩子! ??
void processData(vector<int>& data, const vector<int>& cache = empty_cache) {
    static const vector<int> empty_cache;  // 只創(chuàng)建一次,超級(jí)省錢~
}

就像奶茶店準(zhǔn)備一個(gè)樣品杯放在柜臺(tái),所有人都看這一個(gè)就好啦! 

為什么要這樣做呢? 

  • 第一種寫法就像個(gè)敗家子,每次都要new新的vector
  • 第二種寫法是個(gè)小機(jī)靈鬼,用static只創(chuàng)建一次
  • 而且還加了const,保證沒人能改它,多安全呀! 

記住啦:默認(rèn)參數(shù)也要節(jié)約資源,做個(gè)環(huán)保小衛(wèi)士! 

默認(rèn)參數(shù)的高級(jí)用法 

1. 枚舉默認(rèn)參數(shù) - 讓代碼更有靈魂! 

還在用普通的數(shù)字做默認(rèn)參數(shù)嗎? 太土啦! 來看看這個(gè)高大上的寫法:

enum class LogLevel {
    INFO = 0,     // 小本本記一下 ??
    WARNING = 1,  // 有點(diǎn)小問題 ??
    ERROR = 2     // 完蛋啦! ??
};

這樣用起來多清晰呀:

void log(const string& message, LogLevel level = LogLevel::INFO) {
    // 比 int level = 0 清楚多啦!
}

看看這些可愛的調(diào)用方式:

log("今天天氣真好!");               // 默認(rèn)是 INFO,多輕松~ ??
log("咦,服務(wù)器有點(diǎn)卡", LogLevel::WARNING);  // 警告一下下 ??
log("完蛋,數(shù)據(jù)庫炸了", LogLevel::ERROR);    // 大事不好啦! ??

為什么要這樣寫呢? 

  • 代碼可讀性蹭蹭往上漲 
  • 再也不用記那些神秘?cái)?shù)字啦 
  • IDE自動(dòng)提示,打字超輕松 
  • 不小心打錯(cuò)了,編譯器立馬提醒你 

記住: 用枚舉做默認(rèn)參數(shù),讓你的代碼既專業(yè)又可愛! 

2. 函數(shù)重載和默認(rèn)參數(shù)的完美組合 - 就像雙胞胎一樣默契! 

嘿,想不想看看函數(shù)重載和默認(rèn)參數(shù)怎么攜手共舞? 來看這個(gè)可愛的例子:

class Timer {
public:
    // 基礎(chǔ)版本 - 簡(jiǎn)單又可愛! ??
    void start(int intervalMs = 1000) {
        start(intervalMs, nullptr);
    }

這個(gè)基礎(chǔ)版本就像是個(gè)開心果,只需要告訴它時(shí)間間隔就能工作啦!不給時(shí)間?沒關(guān)系,默認(rèn)1秒就出發(fā)! 

    // 高級(jí)版本 - 多了個(gè)回調(diào)函數(shù),高端大氣上檔次! ?
    void start(int intervalMs, function<void()> callback) {
        // 神奇的實(shí)現(xiàn)代碼...
    }
};

這個(gè)高級(jí)版本就像是基礎(chǔ)版本的升級(jí)款,不僅能定時(shí),還能在時(shí)間到了的時(shí)候做一些有趣的事情!

使用起來就像點(diǎn)外賣一樣簡(jiǎn)單: 

Timer t;
t.start();                    // 懶人版:默認(rèn)1秒 ??
t.start(2000);               // 小改版:2秒 ??
t.start(500, []{ 
    cout << "嘀嗒!" << endl;  // 高級(jí)版:還能唱歌! ??
});

這就是默認(rèn)參數(shù)和函數(shù)重載的完美搭配! 就像奶茶里的珍珠和布丁,各有各的精彩~ 

什么時(shí)候不要用默認(rèn)參數(shù)呢?讓我們來八卦一下!

1. 當(dāng)默認(rèn)值是個(gè)"三心二意"的小可愛時(shí) 

你看這個(gè)代碼,它看起來多么單純:

// 這樣寫可不太好哦~ ??
void connectDatabase(string host = "localhost", int timeout = 30);

但是等等!如果默認(rèn)值經(jīng)常變來變?nèi)?,那這些寫死的值不就像個(gè)"渣男"一樣讓人困擾嗎?

來看看這個(gè)"專一"的寫法:

class DatabaseConfig {
    static string DEFAULT_HOST;     // 把默認(rèn)值都安排得明明白白 ??
    static int DEFAULT_TIMEOUT;     // 以后要改也是一個(gè)地方改,多省心! ?
public:
    // ... 
};

2. 當(dāng)參數(shù)們想要"談戀愛"時(shí)

看看這段代碼,參數(shù)之間藕斷絲連:

// 這樣的"三角關(guān)系"可不太好 ??
void createWindow(
    int width = 800, 
    int height = 600, 
    float ratio = width/height  // 哎呀,這關(guān)系有點(diǎn)復(fù)雜?。?);

不如來個(gè)"媒婆",幫它們組成一個(gè)幸福的小家庭:

struct WindowConfig {
    int width = 800;           // 小夫妻住在一起 ??
    int height = 600;          // 整整齊齊的 ?
    float ratio() const {      // 需要的時(shí)候再計(jì)算,多么和諧! ??
        return float(width) / height;
    }
};

// 看看,多么簡(jiǎn)單!
void createWindow(const WindowConfig& config = {}); // 一個(gè)參數(shù)搞定一切 ??

記住啦:

  • 愛變心的默認(rèn)值要管起來
  • 相互依賴的參數(shù)要打包走
  • 代碼要簡(jiǎn)單,生活要快樂

這樣寫代碼,不僅自己開心,維護(hù)的人也開心!皆大歡喜啦~ 

總結(jié)

  • 默認(rèn)參數(shù)是一個(gè)強(qiáng)大的工具,但需要謹(jǐn)慎使用
  • 優(yōu)先考慮默認(rèn)參數(shù)而不是簡(jiǎn)單的函數(shù)重載
  • 注意默認(rèn)參數(shù)的聲明位置和可變性
  • 使用枚舉和結(jié)構(gòu)體來增強(qiáng)代碼的可讀性和可維護(hù)性
  • 在復(fù)雜場(chǎng)景下,考慮使用配置對(duì)象模式
責(zé)任編輯:趙寧寧 來源: everystep
相關(guān)推薦

2010-01-20 17:48:07

C++ 函數(shù)重載

2010-01-18 16:56:30

C++函數(shù)

2012-12-11 10:24:21

開放式封閉式云端

2010-02-05 15:59:26

C++函數(shù)重載

2011-07-20 17:16:50

C++重載函數(shù)

2010-01-11 15:21:18

C++語言

2010-02-04 09:26:23

C++模板函數(shù)重載

2009-05-26 09:31:00

C++重載覆蓋

2016-12-26 09:23:18

C++函數(shù)覆蓋

2010-01-27 13:38:29

C++ Sum函數(shù)

2009-07-31 16:00:30

C#函數(shù)重載

2010-01-25 10:10:42

C++函數(shù)參數(shù)

2010-01-20 17:32:16

C++函數(shù)

2024-01-29 01:30:00

函數(shù)C++編程

2021-01-06 05:29:04

C語言參數(shù)應(yīng)用

2024-01-23 10:48:44

C++函數(shù)重載開發(fā)

2010-01-20 18:06:06

C++虛基類

2010-02-04 09:33:08

C++指針重載

2020-06-17 12:22:44

C覆蓋重載

2010-01-25 09:57:39

C++函數(shù)參數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)