欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++隱式類(lèi)型轉(zhuǎn)換示例分享

 更新時(shí)間:2014年03月11日 15:32:49   作者:  
這篇文章主要介紹了c++隱式類(lèi)型轉(zhuǎn)換的二個(gè)示例,需要的朋友可以參考下

復(fù)制代碼 代碼如下:

/*=============================================================================
#     FileName: explicit_try.cc
#         Desc: 驗(yàn)證含有一個(gè)參數(shù)的非explicit構(gòu)造函數(shù)是否可以拷貝初始化
=============================================================================*/
#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; }
        //隱式類(lèi)型轉(zhuǎn)換,用string生成一個(gè)臨時(shí)量,因此可以綁定到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);//隱式類(lèi)型轉(zhuǎn)換
    //People::addToVector("Bob");//只允許一步的隱式類(lèi)型轉(zhuǎn)換

    vector<string> v = People::getVector();
    cout << "name_arr:" << endl;
    for (const auto &p : v) {
        cout << p << " ";
    }
    cout << endl;

    string myName = "guo";
    People guo = myName; //隱式類(lèi)型轉(zhuǎn)換允許拷貝初始化形式的轉(zhuǎn)換
    cout << guo.getName() << endl;
    return 0;
}



下面再來(lái)一個(gè)例子

復(fù)制代碼 代碼如下:

#include <string>
#include <iostream>
using namespace std;
class Fruit               //定義一個(gè)類(lèi),名字叫Fruit
{
 string name;     //定義一個(gè)name成員          
 string colour;   //定義一個(gè)colour成員

public:
 bool isSame(const Fruit &otherFruit)   //期待的形參是另一個(gè)Fruit類(lèi)對(duì)象,測(cè)試是否同名
 {
  return name == otherFruit.name;
 }
 void print()              //定義一個(gè)輸出名字的成員print()
 {
  cout<<colour<<" "<<name<<endl;
 }
 Fruit(const string &nst,const string &cst = "green"):name(nst),colour(cst){}  //構(gòu)造函數(shù)

 Fruit(){}
};

int main()
{
 Fruit apple("apple");
 Fruit orange("orange");
 cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl;  //沒(méi)有問(wèn)題,肯定不同
 cout<<"apple = /"apple/" ?:"<<apple.isSame(string("apple")); //用一個(gè)string做形參?

    return 0;
}

你會(huì)發(fā)現(xiàn)最后的使用上,我們用一個(gè)string類(lèi)型作一個(gè)期待Fruit類(lèi)形參的函數(shù)的參數(shù),結(jié)果竟然得出了是true(1),不要感到奇怪,這就是我現(xiàn)在要講的東西,隱式類(lèi)類(lèi)型轉(zhuǎn)換:“可以用單個(gè)實(shí)參來(lái)調(diào)用的構(gòu)造函數(shù)定義了從形參類(lèi)型到該類(lèi)型的一個(gè)隱式轉(zhuǎn)換。”(C++ Primer)首先要單個(gè)實(shí)參,你可以把構(gòu)造函數(shù)colour的默認(rèn)實(shí)參去掉,也就是定義一個(gè)對(duì)象必須要兩個(gè)參數(shù)的時(shí)候,文件編譯不能通過(guò)。然后滿(mǎn)足這個(gè)條件后,系統(tǒng)就知道怎么轉(zhuǎn)換了,不過(guò)這里比較嚴(yán)格:)以前我們構(gòu)造對(duì)象的時(shí)候Fruit apple("apple")其實(shí)也已經(jīng)有了一個(gè)轉(zhuǎn)換,從const char *的C字符串格式,轉(zhuǎn)為string,在這里,你再apple.isSame("apple")的話(huà),蠢系統(tǒng)不懂得幫你轉(zhuǎn)換兩次,所以你必須要用string()來(lái)先強(qiáng)制轉(zhuǎn)換,然后系統(tǒng)才知道幫你從string隱式轉(zhuǎn)換為Fruit,當(dāng)然其實(shí)你自己也可以幫他完成。cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple"));這樣。參考例子1.2 :Fruit apple = Fruit("apple");  //定義一個(gè)Fruit類(lèi)對(duì)象apple。也就是這樣轉(zhuǎn)換的。不過(guò)這就叫顯式轉(zhuǎn)換了,我們不標(biāo)出來(lái),系統(tǒng)幫我們完成的,叫隱式的貝。這里要說(shuō)的是,假如你顯示轉(zhuǎn)換就可以不管有多少參數(shù)了,比如在前面提到的必須需要兩個(gè)參數(shù)的構(gòu)造函數(shù)時(shí)的例子。

例:

復(fù)制代碼 代碼如下:

#include <string>
#include <iostream>
using namespace std;
class Fruit               //定義一個(gè)類(lèi),名字叫Fruit
{
 string name;     //定義一個(gè)name成員          
 string colour;   //定義一個(gè)colour成員

public:
 bool isSame(const Fruit &otherFruit)   //期待的形參是另一個(gè)Fruit類(lèi)對(duì)象,測(cè)試是否同名
 {
  return name == otherFruit.name;
 }
 void print()              //定義一個(gè)輸出名字的成員print()
 {
  cout<<colour<<" "<<name<<endl;
 }
 Fruit(const string &nst,const string &cst):name(nst),colour(cst){}  //構(gòu)造函數(shù)

 Fruit(){}
};

int main()
{
 Fruit apple("apple","green");
 Fruit orange("orange","yellow");
 cout<<"apple = orange ?: "<<apple.isSame(orange)<<endl;  //沒(méi)有問(wèn)題,肯定不同
 cout<<"apple = /"apple/" ?:"<<apple.isSame(Fruit("apple","green")); //顯式轉(zhuǎn)換
    return 0;
}


在你不想隱式轉(zhuǎn)換,以防用戶(hù)誤操作怎么辦?C++提供了一種抑制構(gòu)造函數(shù)隱式轉(zhuǎn)換的辦法,就是在構(gòu)造函數(shù)前面加explicit關(guān)鍵字,你試試就知道,那時(shí)你再希望隱式轉(zhuǎn)換就會(huì)導(dǎo)致編譯失敗,但是,要說(shuō)明的是,顯式轉(zhuǎn)換還是可以進(jìn)行。

相關(guān)文章

  • C語(yǔ)言三子棋小游戲?qū)崿F(xiàn)全程

    C語(yǔ)言三子棋小游戲?qū)崿F(xiàn)全程

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線(xiàn)連起來(lái),相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線(xiàn),對(duì)方就算輸了,想用c語(yǔ)言做出這個(gè)游戲,事實(shí)上也是比較簡(jiǎn)單的,下面通過(guò)c語(yǔ)言進(jìn)行對(duì)五子棋的分析
    2022-05-05
  • 深入解析C++編程中的靜態(tài)成員函數(shù)

    深入解析C++編程中的靜態(tài)成員函數(shù)

    這篇文章主要介紹了深入解析C++編程中的靜態(tài)成員函數(shù),是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++實(shí)現(xiàn)LeetCode(66.加一運(yùn)算)

    C++實(shí)現(xiàn)LeetCode(66.加一運(yùn)算)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(66.加一運(yùn)算),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談C/C++ 語(yǔ)言中的表達(dá)式求值

    淺談C/C++ 語(yǔ)言中的表達(dá)式求值

    下面小編就為大家?guī)?lái)一篇淺談C/C++ 語(yǔ)言中的表達(dá)式求值。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • C語(yǔ)言一篇精通鏈表的各種操作

    C語(yǔ)言一篇精通鏈表的各種操作

    鏈表是一種常見(jiàn)的重要的數(shù)據(jù)結(jié)構(gòu)。它是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu),是根據(jù)需要開(kāi)辟內(nèi)存單元,鏈表這種數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實(shí)現(xiàn),即一個(gè)結(jié)點(diǎn)中應(yīng)包含一個(gè)指針變量,用它存放下一結(jié)點(diǎn)的地址
    2022-04-04
  • 如何通過(guò)wrap malloc定位C/C++的內(nèi)存泄漏問(wèn)題

    如何通過(guò)wrap malloc定位C/C++的內(nèi)存泄漏問(wèn)題

    用C/C++開(kāi)發(fā)的程序執(zhí)行效率很高,但卻經(jīng)常受到內(nèi)存泄漏的困擾。本文提供一種通過(guò)wrap malloc查找memory leak的思路。
    2021-05-05
  • 封裝常用正則表達(dá)式的用法

    封裝常用正則表達(dá)式的用法

    這篇文章主要介紹了使用C++封裝常用正則表達(dá)式的用法,方便以后直接使用,最后還給出了測(cè)試代碼,大家可運(yùn)行測(cè)試使用
    2014-03-03
  • C++二分查找(折半查找)算法實(shí)例詳解

    C++二分查找(折半查找)算法實(shí)例詳解

    這篇文章主要介紹了C++二分查找(折半查找)算法,結(jié)合實(shí)例形式詳細(xì)分析了二分查找算法的原理、思想、實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C++實(shí)現(xiàn)雙向冒泡排序算法

    C++實(shí)現(xiàn)雙向冒泡排序算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雙向冒泡排序算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 深入理解c/c++ 內(nèi)存對(duì)齊

    深入理解c/c++ 內(nèi)存對(duì)齊

    這篇文章主要介紹了c/c++ 內(nèi)存對(duì)齊,有需要的朋友可以參考一下
    2014-01-01

最新評(píng)論