C++默認參數實現原理分析

簡介定義

C++默認參數指的是當函數調用中省略了實參時自動使用的一個值。寫法如下:

void foo(int a = 1)
{
}

void foo(int a, int b=1, int c=1)
{
}

默認參數有兩個規則,

  • 規則一:從第一個出現默認參數的參數開始,後面的參數必須也指定默認參數
void foo(int a=1, int b, int c=1); //錯誤
void foo(int a=1, int b, int c); //錯誤
void foo(int a, int b, int c=1); //正確
void foo(int a, int b=1, int c=1); //正確
void foo(int a=1, int b=1, int c=1); //正確
  • 規則二:聲明和定義分開時,僅聲明處做初始賦值動作
void foo(int a = 1);

void foo(int a)
{
}

分析原理

在我的理解中,C++的各種特性基本是靠編譯器隱藏了很多特殊操作,來實現這些特性,諸如面向對象等等。實際純C語言結合一些編譯器選項,完全可以實現C++的絕大多數效果。所以直接看彙編,扒開編譯器隱藏的細節,到彙編這一層基本原形必露,藉助Compiler Explorer:

對比發現有沒有默認參數兩者彙編一模一樣,那爲什麼可以實現不同的效果呢?再看下如果調用一下這2個函數:

可以看到如果不給默認參數賦值,則在調用處會由編譯器自動給參數賦值爲默認值,如果你指定了參數值,就用你指定的。也就是說編譯器玩了個花招而已,並沒多牛逼。

瞭解了實現原理後,再分析下爲什麼有上面的兩個規則約束。假設帶默認參數的函數可以這樣定義:

int foo(int a = 1, int c);

按照它的特性,可以在調用處以這幾種形式調用:

foo(1);//本意是a使用默認值a=1,c使用傳遞的值c=1
foo(1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章