c++隱式類型轉換示例分享。本站提示廣大學習愛好者:(c++隱式類型轉換示例分享)文章只能為提供參考,不一定能成為您想要的結果。以下是c++隱式類型轉換示例分享正文
/*=============================================================================
# FileName: explicit_try.cc
# Desc: 驗證含有一個參數的非explicit結構函數能否可以拷貝初始化
=============================================================================*/
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::vector;
class People {
public:
People() = default;
People(string s):name(s) { }
string getName() const { return name; }
static vector<string> &getVector() { return name_arr; }
//隱式類型轉換,用string生成一個暫時量,是以可以綁定到const形參上
static void addToVector(const People &p) {
name_arr.push_back(p.getName());
}
private:
string name = "";
static vector<string> name_arr;
};
vector<string> People::name_arr = {};
int main(int argc, const char *argv[])
{
People p;
cout << "p :" << endl;
cout << p.getName() << endl;
People tom("tom");
People::addToVector(tom);
string Bob = "Bob";
People::addToVector(Bob);//隱式類型轉換
//People::addToVector("Bob");//只許可一步的隱式類型轉換
vector<string> v = People::getVector();
cout << "name_arr:" << endl;
for (const auto &p : v) {
cout << p << " ";
}
cout << endl;
string myName = "guo";
People guo = myName; //隱式類型轉換許可拷貝初始化情勢的轉換
cout << guo.getName() << endl;
return 0;
}
上面再來一個例子
#include <string>
#include <iostream>
using namespace std;
class Fruit //界說一個類,名字叫Fruit
{
string name; //界說一個name成員
string colour; //界說一個colour成員
public:
bool isSame(const Fruit &otherFruit) //等待的形參是另外一個Fruit類對象,測試能否同名
{
return name == otherFruit.name;
}
void print() //界說一個輸入名字的成員print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst,const string &cst = "green"):name(nst),colour(cst){} //結構函數
Fruit(){}
};
int main()
{
Fruit apple("apple");
Fruit orange("orange");
cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl; //沒有成績,確定分歧
cout<<"apple = /"apple/" ?:"<<apple.isSame(string("apple")); //用一個string做形參?
return 0;
}
你會發明最初的應用上,我們用一個string類型作一個等待Fruit類形參的函數的參數,成果居然得出了是true(1),不要覺得奇異,這就是我如今要講的器械,隱式類類型轉換:“可以用單個實參來挪用的結構函數界說了從形參類型到該類型的一個隱式轉換。”(C++ Primer)起首要單個實參,你可以把結構函數colour的默許實參去失落,也就是界說一個對象必需要兩個參數的時刻,文件編譯不克不及經由過程。然後知足這個前提後,體系就曉得怎樣轉換了,不外這裡比擬嚴厲:)之前我們結構對象的時刻Fruit apple("apple")其實也曾經有了一個轉換,從const char *的C字符串格局,轉為string,在這裡,你再apple.isSame("apple")的話,蠢體系不理解幫你轉換兩次,所以你必需要用string()來先強迫轉換,然後體系才曉得幫你從string隱式轉換為Fruit,固然其實你本身也能夠幫他完成。cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple"));如許。參考例子1.2 :Fruit apple = Fruit("apple"); //界說一個Fruit類對象apple。也就是如許轉換的。不外這就叫顯式轉換了,我們不標出來,體系幫我們完成的,叫隱式的貝。這裡要說的是,假設你顯示轉換便可以不論有若干參數了,好比在後面提到的必需須要兩個參數的結構函數時的例子。
例:
#include <string>
#include <iostream>
using namespace std;
class Fruit //界說一個類,名字叫Fruit
{
string name; //界說一個name成員
string colour; //界說一個colour成員
public:
bool isSame(const Fruit &otherFruit) //等待的形參是另外一個Fruit類對象,測試能否同名
{
return name == otherFruit.name;
}
void print() //界說一個輸入名字的成員print()
{
cout<<colour<<" "<<name<<endl;
}
Fruit(const string &nst,const string &cst):name(nst),colour(cst){} //結構函數
Fruit(){}
};
int main()
{
Fruit apple("apple","green");
Fruit orange("orange","yellow");
cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl; //沒有成績,確定分歧
cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple","green")); //顯式轉換
return 0;
}
在你不想隱式轉換,以防用戶誤操作怎樣辦?C++供給了一種克制結構函數隱式轉換的方法,就是在結構函數後面加explicit症結字,你嘗嘗就曉得,那時你再願望隱式轉換就會招致編譯掉敗,然則,要解釋的是,顯式轉換照樣可以停止。