前言
並不是每一個項目都需要設計複雜的接口,但是爲了養成很好的編程習慣,我覺得一般還是寫複雜點吧!更復雜、更多的代碼是爲了之後更好的擴展和維護。
正確傳入形參
class Date{
public:
Date(int month,int day,int year);
};
對於這樣一個類,在傳遞形參時在三個變量的放置順序上可能出錯,而這種錯誤編譯系統識別不了,這爲之後的使用埋下了隱患。所以,對於此處變量的傳遞上,要達成這樣一個目的:不允許傳錯順序。
這裏會出錯完全是因爲三個值都是int類型,如果分別採用別的類型自然就可以避免了。解決方案如下
struct Day {
explicit Day(int d) :val(d) {}
int val;
};
struct Month {
explicit Month(int m):val(m){}
int val;
};
struct Year {
explicit Year(int y):val(y){}
int val;
};
class Date {
public:
Date(const Month& m,const Day& d,const Year& y){ }
};
什麼位置上可以使用explicit
上面構造了三個結構體變量,其中各自的構造函數前都用了explicit關鍵字進行了修飾。
什麼是隱式轉換?
1,當構造函數只有一個形參時。這個形參與傳入函數的變量類型一致。
class Person
{
public:
Person(const std::string&name) : m_name(name) {}
//int func(const Person & other) { return 1; }
std::string m_name;
};
int func(const Person & other) { return 1; }
測試
Person a("");
std::string name = "su";
int result = func(name);
cout << result << endl;
2,構造函數的第一個形參類型與傳遞進函數的變量類型一致,其他形參都是默認的。
比如,增加上面的構造函數的形參數量,像下面這樣,都是滿足情況的。
Person(const std::string&name,int i=1) : m_name(name) {}
上面這兩種情況下,本來往函數func內傳入的應該是Person對象實例,但是卻可以傳入一個變量也能滿足條件,這就叫構造函數的隱式轉換。在這種構造函數前加上explicit就能避免出現這樣的問題了。