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語言裡簡單...