C 函式過載及其修飾規則

2021-09-22 12:34:08 字數 2351 閱讀 7741

相同的作用域、相同名稱、引數列表不同的函式——要求:引數列表必須不同(型別/個數/次序) 與返回值型別無關

為什麼c語言沒有函式過載 而c++有:

因為c++在編譯鏈結階段有函式名修飾規則,可對引數型別不同的同名函式修改為不同名(例:cout/couts),而在c語言中,編譯器對函式名字的修飾規則,僅在函式名字前加下劃線

修飾規則(不考慮作用域):

voidprint(int i) -->_z5printi(z5 對應返回型別print對應函式名i為引數列表

voidprint(string str) -->_z5printss

voidprint(long l) -->_z5printl

voidprint(char str) -->_z5printc

此時的修飾規則為 :返回型別+函式名+引數列表

再加上作用域後為

#includeusing namespace std;

class test{ //在test的類域中

public:

void print(int i)

{cout<<"int"《我們現在再來看一下這時print函式對映之後的函式名:

voidprint(int i) -->_zn4test5printei

voidprint(char c) -->_zn4test5printec

對映機制為作用域+返回型別+函式名+引數列表

精確匹配引數匹配而不做轉換,或者只是做微不足道的轉換,如陣列名到指標、函式名到指向函式的指標、t到const t;

提公升匹配即整數提公升(如bool 到 int、char到int、short 到int),float到double

使用標準轉換匹配:如int 到double、double到int、double到long double、derived到base、t到void、int到unsigned int;

使用使用者自定義匹配

使用省略號匹配:類似printf中省略號引數

如果在最高層有多個匹配函式找到,呼叫將被拒絕(因為有歧義、模凌兩可)。

例子:void print(int);

void print(const char*);

void print(double);

void print(long);

void print(char);

void h(char c,int i,short s, float f)

{print(c );//精確匹配,呼叫print(char)

print(i);//精確匹配,呼叫print(int)

print(s);//注意:當沒有精準匹配的時候會整數提公升,即呼叫print(int)

print(f);//float到double的提公升,呼叫print(double)

print('a');//精確匹配,呼叫print(char)

print(49);//精確匹配,呼叫print(int)

print(0);//精確匹配,呼叫print(int)

print("a");//精確匹配,呼叫print(const char*)

因建構函式和類名相同,避免了因型別不同例項化物件時的麻煩

操作符過載即是函式過載,豐富了操作符的功能

注意:當過載出無參的函式時和同名的全預設函式不要同時存在,會造成二義性

例:

int add(); 

int add(int a=10);

add(); //此時呼叫即符合無參的過載函式又符合全預設函式

C 函式名的修飾規則

我們知道在c 中有函式過載這樣乙個東西,當我們定義了幾個功能類似且函式名是一樣的函式的時候,只要它的引數列表不同,編譯是可以通過的,但是在c中是不可以的。double add double a,double b int add int a,char b char add char a,char b ...

c 修飾符過載

主要有兩種方式 利用友元 類成員方法。include using namespace std 演示修飾符過載 一般都用成員方法過載 特殊的沒有辦法修改核心庫的用友元的方法來過載 例如 class chicken chicken intgetweight void setweight int weig...

建構函式及其過載and繼承

using system using system.collections.generic using system.linq using system.text using system.threading.tasks 年齡為 p1.name,p1.age 名字是,年齡為 p2.name,p2.a...