預設引數與函式過載

2021-09-25 08:25:12 字數 2881 閱讀 6919

預設引數是

宣告或定義函式時為函式的

引數指定乙個預設值。在呼叫該函式時,如果沒有指定實參則採用該預設值,否則使用指定的實參。

void testfunc(int a = 0) 

// 注意:如果生命與定義位置同時出現,恰巧兩個位置提供的值不同,那編譯器就無法確定到底該用那個預設值。

3.

預設值必須是常量或者全域性變數

4. c

語言不支援(編譯器不支援)

是函式的一種特殊情況,

c++允許在

同一作用域中宣告幾個功能類似

的同名函式,這些同名函式的形參列表(引數個數或型別或順序)必須不同,常用來處理實現功能類似資料型別不同的問題。

在c/c++

中,乙個程式要執行起來,需要經歷以下幾個階段:

預處理、編譯、彙編、鏈結

名字修飾是一種

在編譯過程中,將

函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分各個函式,將函式通過某種演算法,重新修飾為乙個全域性唯一的名稱。

c語言

在函式名字前面新增了下劃線

int add(int left, int right);

int main()

編譯器報錯:

error lnk2019:

無法解析的外部符號

_add,該符號在函式

_main中被引用。 上述

addmain函式中引用的add函式找不到函式體。從報錯結果中可以看到,

c語言只是簡單的在函式名前新增下劃線。因此當工程中存在相同函式名的函式時,就會產生衝突。

由於c++要支援函式過載,命名空間等,使得其修飾規則比較複雜,不同編譯器在底層的實現方式可能都有差異。

int add(int left, int right);

double add(double left, double right);

int main()

在vs

error lnk2019:

無法解析的外部符號

"double

cdecl add(double,double)" (?add@@yannn@z)

error lnk2019:

無法解析的外部符號

"int __cdecl add(int,int)" (?add@@yahhh@z)

通過上述錯誤可以看出,編譯器實際在底層使用的不是

add名字,而是被重新修飾過的乙個比較複雜的名字,被重新

修飾後的名字

包含了:

函式的名字以及引數型別。這就是為什麼函式過載中幾個同名函式要求其引數列表不同的原因。只要

引數列表不同,編譯器在編譯時通過對函式名字進行重新修飾,將引數型別包含在最終的名字中,就可保證

名字在底層的全域性唯一性

有時候在

c++工程中可能需要

將某些函式按照c的風格來編譯,在函式前加

extern "c",意思是告訴編譯器,將該函式按照

c語言規則來編譯。

extern "c" int add(int left, int right);

int main()

error lnk2019:

無法解析的外部符號

_add,該符號在函式

_main

中被引用

1. 下面兩個函式能形成函式過載嗎?有問題嗎或者什麼情況下會出問題?

void testfunc(int a = 10) 

{ cout<

2. c

語言中為什麼不能支援函式過載?

中函式過載底層是怎麼處理的?

中能否將乙個函式按照

c的風格來編譯?

在函式前加

extern "c",意思是告訴編譯器,將該函式按照

c語言規則來編譯。

預設引數與函式過載

一.預設引數 形參a和b都帶有預設值 使用者用掉該函式時,沒傳參,就用預設值。傳參就用所傳值。1,分類 1.全預設引數 每個引數都帶有預設值 void t int a 1,int b 2,int c 3 int t 不能過載,引數列表相同,不能過載。注意 如果兩個函式僅僅是返回型別不同,則不能構過載...

c 函式過載與預設引數

函式過載 是指同一作用域內,一組具有相同函式名,不同引數列表的函式,構成過載關係,這組名稱相同的函式成為過載函式。過載函式通常完成的功能相近,這樣做的好處是減少了函式名的數量,提高了程式的可讀性。注意 過載與函式的返回型別無關,引數相同僅返回值不同的兩個函式不構成過載關係,與形參名字無關,只與引數的...

預設引數 函式過載

預設引數 帶有初始值的引數 注 1.非全預設引數,引數的預設值賦值要從最後邊從右向左依次進行 eg int sum int a,int b 1,int c 2 2.實參的匹配是從左向右進行的 eg int sum int a,int b 1,int c 2 sum 10,20 10對應a,20對應b...