C 同名函式選擇,命名空間

2021-08-10 19:34:01 字數 2253 閱讀 1686

void may(int);

float may(float, float y=3);

void may(char);

char * may(const cahr & );

template

void may(const t &);

template

void may(t *);

編譯器選擇匹配的函式順序如下 :

1. 完全匹配。引數列表和返回型別完全匹配,不需要任何轉化。其中,常規函式》顯示具體化》普通模板.

2. 提公升轉換。形參和實參並非完全匹配,帶入的實參會自動轉化為形參的型別,精度不會改變,是安全的轉化。char short 轉為 int, float 轉為double

3. 標準轉化。可能會丟失精度。int 轉為 char ,long 轉為double。

完全匹配 和最佳匹配

實參形參

type

type &

type &

type

type

*type

type (arguement-list)

type * (arguement-list)

type

const type

type

volatile type

type *

const type

type *

volatile type*

所以,以下4個都是完全匹配,從報錯中明顯可見

自定義匹配

從結果看,確實根據使用者需要,呼叫了相應的函式。

無法確定的模板變數型別處理

template

void test(t1 x ,t2 y)

對於上述的**將會出現乙個問題,無法預先知道a的型別。可以使用函式decltype()

decltype(x+y) a =x+y;//根據x+y的型別確定變數型別,由編譯器確定

//對於函式返回型別

template

auto test(t1 x ,t2 y) ->decltype(x+y);

1、volatile進行優化,強制編譯器從硬體中讀取。雖然程式沒有改變某個記憶體的值,但是硬體可能根據條件使記憶體變化,比如串列埠接受資料

2、mutable 指出,即使結構體或者變數被定義為const型別,內部的某個引數仍然可變。

struct data

const data x =;

x.a=5; //這是可行的

定義乙個名空間

namespace

jack

namespace

jill

namespace

jack

}

jack::x=3.5

;jack::y=8

;

using宣告 和 using編譯指令
int main()

using namespace

jill;

C 命名空間 過載函式

1.意義 c 中引入命名空間的概念,旨在防止命名衝突與命名汙染。2.定義方式 namespace 命名空間名2.特點 1 可以巢狀 即某個命名空間內部還可以再定義另乙個命名空間 2 多個命名空間可以使用相同的名字。但是這不就違背了引入命名空間的初衷嗎。其實並不是,多個命名空間可以擁有相同的名字,但是...

spring p命名空間 c命名空間

p命名空間 1.需要引入命名空間p 並不真實存在 是在spring內部中實現的 xmlns p 2.如果是引用注入需要加 ref字尾 p和c命名空間 並不適用於集合引數 c命名空間 1.需要引入命名空間c 並不真實存在 是在spring內部中實現的 xmlns c 2.可以使用c 引數名 或c 引數...

C 命名空間 預設命名空間與匿名命名空間

2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...