【C++】確保接口被正確使用

前言

並不是每一個項目都需要設計複雜的接口,但是爲了養成很好的編程習慣,我覺得一般還是寫複雜點吧!更復雜、更多的代碼是爲了之後更好的擴展和維護。


正確傳入形參

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就能避免出現這樣的問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章