explicit#
用於修飾類別的建構函式。它的作用是防止隱式類型轉換,只允許顯式地呼叫建構函式進行物件的初始化。
當一個建構函式被宣告為explicit
時,它將禁止編譯器執行隱式的類型轉換來呼叫該建構函式。這意味著只能通過顯式地呼叫建構函式來建立物件,而不能使用隱式的類型轉換。
下面是一個使用explicit
關鍵字的示例:
auto#
class MyInt {
public:
explicit MyInt(int value) : num(value) {}
int getValue() const { return num; }
private:
int num;
};
void printValue(const MyInt& obj) {
cout << obj.getValue() << endl;
}
int main() {
MyInt obj1 = 10; // 錯誤,禁止隱式類型轉換
MyInt obj2(20); // 正確,顯式呼叫建構函式
printValue(obj2); // 正確,傳遞物件作為參數
printValue(30); // 錯誤,禁止隱式類型轉換
return 0;
}
在上面的示例中,MyInt
類別的建構函式被宣告為explicit
,因此禁止了隱式類型轉換。只有通過顯式地呼叫建構函式,才能建立MyInt
物件。這可以避免一些意外的類型轉換,提高程式碼的可讀性和安全性。
需要注意的是,explicit
關鍵字只能用於單參數的建構函式,它不適用於預設建構函式或多參數建構函式。
auto x = 5;
auto y = 3.14;
std::vector<int> v = {1,2,3};
auto it = v.begin(); // it 被推導為std::vector<int>::iterator
atuo
也常用於範圍基於的for
迴圈中,可以簡化迭代器語法。
實現原理#
C++11 中的 auto
關鍵字是一種型別推導機制。當使用 auto
定義一個變數時,編譯器會在編譯期間檢查該變數的初始化運算式,並推導出一個具體的型別。這個過程完全在編譯期進行,不涉及執行時的型別檢查或轉換。
使用場景#
auto
的使用主要有幾個場景:
- 簡化複雜型別的宣告:當涉及到複雜的型別,特別是 STL 容器的迭代器時,
auto
可以簡化程式碼。
std::map<std::string, std::vector<int>> complexMap;
for(auto it = complexMap.begin(); it!= complexMap.end(); ++it){
// do someting
}
-
用於泛型程式設計:在模板程式設計中,當型別依賴於模板參數時,使用
auto
可以簡化程式碼並增加靈活性。 -
自動型別推導:在一些複雜的運算式中,特別是涉及到
Lambda
運算式或其他只能在執行時確定型別的情況,auto
可以自動處理型別推導。
對效能的影響#
使用 auto
並不會對效能產生直接影響。因為 auto
只是在編譯期進行型別推導,不會增加執行時的開銷。實際上,它可以幫助避免一些常見的錯誤,比如隱式類型轉換導致的效能問題。
然而,過度使用 auto
可能會導致程式碼的可讀性降低,特別是當推導的型別不明顯時。因此,建議在型別明確且有助於提高程式碼清晰度和維護性的情況下使用 auto
。