青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 181  文章 - 15  trackbacks - 0
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

在閱讀類型轉換之前,還是先看一下關鍵字explicit(顯式)
書上的例子中的類名叫做Stack,這樣總感覺有些誤解,因為棧這個概念已經在我們的腦海中先入為主了,容易形成思維定式.那么我寫一個和其他任何概念都無關的例子:
class MyClass
{    
    
private:
    
int _number;
    
public:
    MyClass(
int number)
    {
        _number
=number;
    }
};
上面的類很普通,沒什么特別的.我們可以這樣創建這個類的對象:
int main()
{
    MyClass instance
=5;
}
這就比較有意思了,c++還能這樣寫,我以前的確沒有見過.那么explicit關鍵字的作用就是不讓你這樣寫,如果你這樣寫了,編譯器就會給你一個錯誤提示.現在改造一下MyClass
class MyClass
{    
    
private:
    
int _number;
    
public:
    
explicit MyClass(int number)
    {
        _number
=number;
    }
};
main函數不變的情況下,編譯器會這樣提示你:
Explicit.cpp: In function ‘int main()’:
Explicit.cpp:14: 錯誤: conversion from ‘int’ to non-scalar type ‘MyClass’ requested
這樣,就只能這樣寫了:
MyClass instance(5);
好了,下面開始閱讀類型轉換的部分.
1 static_cast
這個操作符的執行過程可以被認為是:它創建了一個新的對象,然后用要轉換的值去初始化這個新對象.這個轉換只有當一個類型轉換被聲明過才能執行.
首先是一個簡單的例子:
//一個簡單的類型轉換
   int valueToBeConverted=int();
   
using namespace std;
   cout
<<static_cast<float>(valueToBeConverted)<<"\n";
很像其他語言中的顯式類型轉換.那么對于我自己的類如何進行轉換呢?可以看一下下面的這個例子:
#include <iostream>

class MyClass2
{
   
public:
    
int IntMember1;
   MyClass2()
   {
      IntMember1
=1;
   }
};
class MyClass1
{
   
public:
   
int IntMember1;
   
virtual void  f()
   {
       std::cout
<<IntMember1<<"\n";
   }
   
explicit MyClass1(MyClass2 instance)
   {
       IntMember1
=instance.IntMember1;
   }
};
int main()
{
   MyClass2 mc2Instance;
   MyClass1 mc1Instance
=static_cast<MyClass1>(mc2Instance);
   mc1Instance.f();
}
注意看上面的粗體字explicit.如果沒有explict對于構造函數的修飾,那么萬全可以簡單爽快的這么寫:
MyClass1 mc1Instance=mc2Instance;
換句話說,如果你想讓別人寫代碼的時候不關心類型,舒舒服服的寫出你認為不安全的代碼,那么你就去掉explicit,如果你想讓別人在寫代碼的時候,讓那些不安全的類型轉換變得更加"顯眼"一些,那么你就按上面這樣寫.然后讓編譯器狠狠的給他們一個警告.
2 dynamic_cast
This operator enables you to downcast a polymorphic type to its real static type. This is
the only cast that is checked at runtime. Thus, you could also use it to check the type of a
polymorphic value.

這個運算符能夠讓你把一個多態的類型轉換成它的真實的靜態類型.這是唯一的在運行時進行檢驗的轉換方法.所以你同樣需要在轉換之前檢驗多態值的類型.
首先dynamic_cast只能夠用于指針或者引用.否則編譯器會告訴你類似這樣的錯誤:
 無法將 ‘scInstance’ 從類型 ‘SubClass’ 動態轉換到類型 ‘class BaseClass’ (target is not pointer or reference)
這里使用書中的例子:
 
class Car;         // 至少擁有一個抽象函數的抽象類
   class Cabriolet : public Car {
       
   };
   
class Limousine : public Car {
       
   };
   
void f(Car* cp)
   {
       Cabriolet
* p = dynamic_cast<Cabriolet*>(cp);
       
if (p == NULL) {
           
//p并非Cabriollet類型
           
       }
   }

In this example, f() contains a special behavior for objects that have the real static type
Cabriolet. When the argument is a reference and the type conversion fails,
dynamic_cast throws a bad_cast exception (bad_cast is described on page 26).
Note that from a design point of view, it it always better to avoid such type-dependent
statements when you program with polymorphic types.
當參數是一個引用并且類型轉換失敗的時候,dynamic_cast會拋出一個bad_cast異常.值得注意的是,從設計的角度來說,通常在進行多態類型的程序編寫時,應該避免這樣的類型依賴.
3 const_cast
This operator adds or removes the constness of a type. In addition, you can remove a
volatile qualification. Any other change of the type is not allowed.
這個操作符添加或除去一個類型的常量化(特性).另外,你可以除去一個變量變化的能力.任何對于這個類型變量的變化都將不被允許.
讓常量可修改的例子:
class MyClass
{
    
public:
        
int MemberValue;
        
void showValue()
        {
            cout
<<"My Value is"<<MemberValue<<"\n";
        }
        MyClass()
        {
            MemberValue
=1;
        }    
};
int main()
{
    
const MyClass myValue;
    MyClass 
*ptr=const_cast<MyClass*>(&myValue);
    ptr
->MemberValue=100;
    ptr
->showValue();
}
上面的例子只是將一個const變得可以修改了,但是注意到書中的這樣一句:
In addition, you can remove a
volatile qualification. Any other change of the type is not allowed.
似乎還可以將一個可變量轉換為非可變的,這里沒有查到相關資料,也許書的后面會有相應解釋,所以這里先放一放.
4 reinterpret_cast
這個比較有趣,支持不兼容類型之間的轉換.以下是例子:
#include <iostream>
using namespace std;
class ClassA
{
    
public:
    
int Value1;
    
int Value2;
    
int Value3;
    
void showValue()
    {
        cout
<<Value1<<","<<Value2<<","<<Value3<<"\n";
    }
};
class ClassB
{
    
public:
    
int Value1;
    
int Value2;
    
int Value3;
    ClassB()
    {
        Value1
=1;
        Value2
=2;
        Value3
=3;
    }
};
int main()
{
    ClassB 
*b=new ClassB();
    ClassA 
*a=reinterpret_cast<ClassA*>(b);
    a
->showValue();
}
同樣,這種轉換對于非基本類型來說,仍然只能支持指針和引用.
這些運算符的優點就是他們明確了類型轉換的意圖,并且能夠讓編譯器獲取更多的信息來了解這些類型轉換的原因,然后當這些轉換操作越過他們的職能的時候,編譯器會報告錯誤.
另外需要注意的是,這些類型轉換都只能接受一個參數.看下面的例子:
    static_cast<Fraction>(15,100)                   
上面不會產生你想要的結果.這里的逗號并不是用來連接兩個參數的,而是作為逗號運算符出現,這里15會被舍棄,而采用100作為參數構造Fraction.
所以還是需要采用下面的方法才合適:
    Fraction(15,100)                             





posted on 2007-06-17 14:56 littlegai 閱讀(275) 評論(0)  編輯 收藏 引用 所屬分類: 我的讀書筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线精品视频免费观看| 雨宫琴音一区二区在线| 日韩视频专区| 亚洲免费观看高清在线观看 | 久久久夜夜夜| 尤物精品在线| 亚洲国产精品国自产拍av秋霞 | 亚洲精品在线视频观看| 欧美精品粉嫩高潮一区二区| 一本综合精品| 亚洲欧美国产制服动漫| 狠狠色综合网站久久久久久久| 另类春色校园亚洲| 欧美国产亚洲视频| 午夜一级在线看亚洲| 篠田优中文在线播放第一区| 在线免费高清一区二区三区| 亚洲激情电影中文字幕| 国产精品久久久久久久app| 久久久噜噜噜久久中文字幕色伊伊 | 一本色道88久久加勒比精品 | 欧美国产丝袜视频| 欧美日韩亚洲综合一区| 久久精品成人一区二区三区| 欧美va亚洲va国产综合| 亚洲欧美日韩一区二区| 久久久久久久国产| 亚洲天堂男人| 久久夜色精品国产亚洲aⅴ| 亚洲性人人天天夜夜摸| 久久久久高清| 亚洲欧美久久| 麻豆国产精品va在线观看不卡| 亚洲天堂久久| 免费看精品久久片| 午夜精品区一区二区三| 欧美激情中文字幕一区二区| 久久av资源网站| 欧美女主播在线| 美日韩丰满少妇在线观看| 欧美色图五月天| 欧美国产一区二区在线观看| 国产欧亚日韩视频| 亚洲免费播放| 亚洲精品视频免费| 久久久精彩视频| 欧美一区不卡| 国产精品jvid在线观看蜜臀| 亚洲国产高清aⅴ视频| 国产午夜精品久久久久久久| 一区二区三区精品国产| 亚洲美女啪啪| 欧美国产一区视频在线观看| 男女精品网站| 国内精品久久久久影院薰衣草| 亚洲免费一级电影| 亚洲一品av免费观看| 欧美理论电影在线观看| 亚洲激情视频在线| 亚洲第一毛片| 老司机免费视频久久| 久久天堂av综合合色| 国产一区二区三区在线观看视频| 一区二区三区欧美在线| 亚洲一区视频| 国产精品毛片| 亚洲欧美日韩另类| 午夜一区二区三区在线观看| 国产乱子伦一区二区三区国色天香| 一区二区三区视频观看| 亚洲视频狠狠| 国产精品视频一二| 亚洲欧美久久久| 久久精品成人一区二区三区| 国产亚洲一级高清| 久久精品在线播放| 欧美国产视频在线| 亚洲伦理在线免费看| 欧美日韩免费在线| 亚洲专区在线视频| 久久亚洲春色中文字幕| 在线免费不卡视频| 欧美激情精品久久久久久蜜臀 | 麻豆av一区二区三区| 狠狠色丁香久久综合频道| 久久久久久久久久看片| 欧美激情一区二区三区| 99xxxx成人网| 国产欧美日韩伦理| 久久久久久久久久久成人| 亚洲国产成人av好男人在线观看| 日韩一区二区免费高清| 国产精品久久久久久久久免费樱桃 | 久久超碰97中文字幕| 狠狠噜噜久久| 欧美日韩精品一区二区在线播放 | 日韩网站免费观看| 欧美影院视频| 亚洲三级影片| 国产精品视频区| 美日韩精品视频| 亚洲天堂视频在线观看| 老司机免费视频一区二区三区 | 国产精品一卡二卡| 久久久久综合网| 一本色道久久综合狠狠躁篇的优点 | 中文在线不卡| 狠狠色伊人亚洲综合成人| 欧美高清免费| 欧美在线观看视频在线 | 亚洲一区视频在线| 在线看日韩av| 国产日韩欧美一区二区| 欧美韩日高清| 久久婷婷国产综合国色天香| 亚洲视频导航| 亚洲国产精品久久久久久女王| 欧美一区二区三区婷婷月色| 91久久综合亚洲鲁鲁五月天| 国产色视频一区| 欧美日韩在线高清| 免费在线欧美视频| 久久av在线看| 亚洲欧美国产高清| 亚洲最新视频在线| 亚洲国产成人高清精品| 久久亚洲一区二区| 久久国产精品72免费观看| 中文日韩在线| 在线一区视频| 亚洲精品字幕| 亚洲欧洲精品一区二区精品久久久 | 亚洲一区二区三区久久 | 久久在线精品| 久久精品一区二区| 亚洲欧美在线一区| 国产精品99久久久久久宅男| 亚洲开发第一视频在线播放| 亚洲电影自拍| 在线日韩视频| 亚洲国产精品热久久| 国产亚洲一区二区在线观看| 国产精品专区第二| 国产精品乱码一区二区三区| 国产精品jizz在线观看美国 | 亚洲欧美综合精品久久成人| 亚洲一级免费视频| 亚洲视频一区二区免费在线观看| 99国产精品久久久久老师| 亚洲欧洲综合另类在线| 91久久国产精品91久久性色| 91久久久在线| 亚洲精品国产精品乱码不99按摩| 亚洲高清激情| 亚洲精品一级| 99国产精品自拍| 亚洲欧美日韩一区在线| 性欧美超级视频| 久久人人看视频| 欧美国产在线视频| 欧美另类一区| 国产精品网站在线观看| 国产欧美一区二区白浆黑人| 国产一区视频在线看| 在线精品亚洲| 99ri日韩精品视频| 欧美亚洲网站| 免费在线成人av| 亚洲每日更新| 性欧美xxxx视频在线观看| 久久免费国产精品1| 欧美日本精品一区二区三区| 国产精品福利网| 狠狠色丁香婷婷综合久久片| 99av国产精品欲麻豆| 香港成人在线视频| 欧美黄色小视频| 亚洲性线免费观看视频成熟| 久久久999精品| 欧美久久久久免费| 国产一区二区三区在线观看网站| 91久久精品国产91性色| 亚洲欧美日韩精品| 欧美成人在线免费观看| 一区二区三区国产精品| 久久久久久日产精品| 国产精品成人在线观看| 在线高清一区| 午夜欧美不卡精品aaaaa| 欧美粗暴jizz性欧美20| 亚洲在线电影| 欧美日本在线看| 狠狠色丁香久久婷婷综合_中| 亚洲小说欧美另类婷婷| 美女成人午夜| 羞羞色国产精品| 欧美日韩亚洲视频| 亚洲大片在线| 久久久av网站| 亚洲欧美高清|