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;
}
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),不要感到奇怪,這就是我現在要講的東西,隱式類類型轉換:“可以用單個實參來調用的構造函數定義了從形參類型到該類型的一個隱式轉換?!保–++ 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。也就是這樣轉換的。不過這就叫顯式轉換了,我們不標出來,系統幫我們完成的,叫隱式的貝。這里要說的是,假如你顯示轉換就可以不管有多少參數了,比如在前面提到的必須需要兩個參數的構造函數時的例子。
例:
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;
}
新聞熱點
疑難解答
圖片精選