c++易錯點總結(1): cpp中的explicit的作用,爲何儘量使用explicit關鍵字

在c++種explicit關鍵字只能用來修飾構造函數。使用explicit可以禁止編譯器自動調用拷貝初始化,還可以禁止編譯器對拷貝函數的參數進行隱式轉換

什麼是拷貝初始化?

舉個例子:
現在我們不使用explicit關鍵字看看會發生什麼?我們發現下面這個代碼明明我們給函數f()傳遞的參數是一個整數,但是編譯器卻自動調用了類A的構造函數,這種就叫做拷貝初始化。這是超出預期的。如果你不希望這樣那麼請在構造函數前面加上explicit關鍵詞禁止編譯器這種自動調用拷貝初始化的行爲,即explicit A(int x){}

#include <iostream>
using namespace std;

class A{
	public:
	 A(int x){
		cout<<"我被用了"<<endl;
	}

};

void f(A a)
{
 	
}
int main( ){

	f(1);// 被隱式轉換爲f(A(1)) ,本來是1卻被自動調用了A(1)這就是拷貝初始化
	//輸出:"我被調用了"
	return 0;
}

什麼是編譯器會對構造函數的參數進行隱式轉換?

假設你想寫個類把整數或者字符數組變成字符串。如果不使用explicit關鍵字你會發現下面這個程序會有bug。

#include <iostream>
using namespace std;
#include<algorithm>
class Str{
	public:
	 Str(int x){
		cout<<"我是想把整數變字符串"<<endl;
	}
	
	Str(const char* a)
	{
		cout<<"我是想把字符數組變字符串"<<endl;
	}

};


int main( ){

	Str s='c'; 
	// 輸出:"我是想把整數變字符串"
	// 它把'c'的ASCII碼傳進去了,如果這樣變成字符串那就得到一個數字,而我們期待的是把'c'變成字符串。
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章