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

隨筆 - 181  文章 - 15  trackbacks - 0
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

在這一部分之前,書中介紹了基本類型的顯式初始化以及簡單的異常處理.
基本類型的顯式初始化是比較簡單的.就是說你在定義一個整型變量的時候,有兩種不同的情況:
int i1;         // undefined value
int i2 = int(); // initialized with zero

如果按照前一種,會作"值未定義;如果按照后一種,則自動被初始化為0.這樣也就確保了你的類在初始化的時候有一個確定的初始值.
至于異常的處理等問題,書中會在后面有比較詳細的描述.這里可以看到比較有意思的一點,就是指定函數拋出的異常類型,這于Java很像:
void f() throw(bad_alloc);
下面轉入正題:命名空間.
有了命名空間,它將會取代函數和類作用于全局,并作為它所統領的那些類和函數的唯一標識存在.這樣可以避免命名沖突情況的出現.正如書中所說:
Unlike classes, namespaces are open for definitions and extensions in different modules. Thus
you can use namespaces to define modules, libraries, or components even by using multiple
files. A namespace defines logical modules instead of physical modules (in UML and other
modeling notations, a module is also called a package).

可以像這樣定義一個命名空間:
namespace MyNameSpace
{
    
class MyClass
    {
        
private:
        
char * _classInfo;
        
public:
        
char* getClassInfo()
        {
            
return _classInfo;
        }
        MyClass(
const char* info)
        {
            _classInfo
=new char[strlen(info)];
            strcpy(_classInfo,info);
        }
        
~MyClass()
        {
            
if(_classInfo)
            {
                std::cout
<<"free classinfo";
                delete[] _classInfo;
            }
        }
    };
    
void printMyClassInfo(MyClass &instance)
    {
        std::cout
<<instance.getClassInfo();
    }
}
從上面可以看出,這個命名空間里面包括了一個類和一個函數.類中包含了char*類型的成員變量.函數printMyClassInfo 以一個MyClass類型的引用作為參數.為什么要用引用呢?熟悉c++的人應當很清楚,我是通過實驗才剛剛知道原因.這個原因我將會在后面說明.
好現在來看一下調用過程,通常的調用過程是這樣的:
int main()
{
    MyNameSpace::MyClass instance(
"MyClass!\n");
    MyNameSpace::printMyClassInfo(instance);
}
這沒有任何問題,但有意思的是,還可以這樣調用:
int main()
{
    MyNameSpace::MyClass instance(
"MyClass!\n");
    printMyClassInfo(instance);
}
看來c++中在使用一個命名空間的類或者函數的時候,這個命名空間就被"自動"引入了.當尋找函數printMyClassInfo的時候會在當前的上下文中進行尋找的同時,還會到以前用到過的命名空間中去尋找.
當然,通常情況下我們喜歡這樣做:
using namespace MyNameSpace; 
int main()
{
    MyClass instance(
"MyClass!\n");
    printMyClassInfo(instance);

}
但是并不是在任何情況下都鼓勵using namespace這種做法的.在書中將得比較清楚:
Note that you should never use a using directive when the context is not clear (such as in header
files, modules, or libraries). The directive might change the scope of identifiers of a namespace,
so you might get different behavior than the one expected because you included or used your
code in another module. In fact, using directives in header files is really bad design.

上面這段話強調了當上下文并不明確的情況下(比如在一個頭文件,組件或者庫里面),不要使用using這種寫法,這個指令會改變命名空間標識符的作用域,這樣你就有可能引發和你預期不相同的行為,因為你會在另外一個組件中引用你的代碼或使用它.事實上,將using標識符寫在頭文件里面是一種相當不好的設計.
在這里,我看了一下c++程序設計語言這本書,發現命名空間除了像上面這樣聲明以外,還可以像類一樣這樣來寫:
在命名空間中這樣定義
void printMyClassInfo(MyClass &);
然后在外面寫函數的主體
void MyNameSpace::printMyClassInfo(MyClass &instance)
{
    std::cout
<<instance.getClassInfo();
}
好了,寫了這么多,再來看看剛才留下來的那個問題.
其實很簡單,一個函數如果傳遞的是值,那么就會在內存中產生一個一模一樣的"復本",而那個字符指針也會被復制一次.當傳送的值超過它的作用域的時候 ,就會被釋放掉,而被復制的"本體"在程序運行結束之后,又會被"釋放一次".這樣在運行的時候,它會提示你這樣的錯誤:
*** glibc detected *** double free or corruption (fasttop): 0x0804a008 ***

在我們的MyClassl類的析構中,我們有一個輸出,所以這里就輸出了兩次:
free classinfofree classinfo




posted on 2007-06-14 22:06 littlegai 閱讀(304) 評論(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>
            一区二区三区|亚洲午夜| 亚洲一区日韩在线| 美女福利精品视频| 亚洲国产高清高潮精品美女| 久久综合色播五月| 另类专区欧美制服同性| 亚洲日本在线视频观看| 亚洲卡通欧美制服中文| 欧美日韩三级电影在线| 先锋影音久久| 久久久久久久久蜜桃| 亚洲国产婷婷综合在线精品 | 在线播放一区| 亚洲国产精品欧美一二99| 欧美jizz19性欧美| 亚洲色图制服丝袜| 欧美专区日韩视频| 亚洲美女黄网| 亚洲一区不卡| 在线观看亚洲一区| 一本到高清视频免费精品| 国产日本亚洲高清| 亚洲国产91| 国产精品网站一区| 欧美激情在线有限公司| 国产精品久久77777| 久久在线视频在线| 欧美三级午夜理伦三级中视频| 久久精品视频在线观看| 欧美精品综合| 美女视频一区免费观看| 欧美午夜精品久久久久久超碰| 美国十次成人| 国产精品推荐精品| 亚洲精品欧洲| 亚洲国产精品成人一区二区 | 亚洲免费中文字幕| 亚洲日本成人女熟在线观看| 亚洲一区三区电影在线观看| 亚洲精品资源| 久久亚洲私人国产精品va媚药 | 亚洲国产高清一区| 亚洲欧美成人一区二区三区| 亚洲麻豆国产自偷在线| 欧美一区在线看| 亚洲欧美日韩综合| 欧美成人一区二区| 美女被久久久| 国产日韩在线一区| 亚洲午夜视频在线| 亚洲婷婷综合色高清在线| 蜜臀va亚洲va欧美va天堂| 久久精品亚洲乱码伦伦中文| 国产精品入口66mio| 日韩视频永久免费观看| 亚洲日本成人女熟在线观看| 久久精品一区二区| 久久网站免费| 国产一区二三区| 亚洲欧美日韩国产综合在线 | 久久精品一区二区三区不卡牛牛 | 精品999在线观看| 亚洲免费影视| 欧美一区二区三区四区在线 | 欧美激情一区二区三区在线视频观看 | 久久久久久精| 国产日韩欧美黄色| 亚洲欧美在线另类| 久久福利视频导航| 国产欧美一区二区精品忘忧草| 中文在线不卡视频| 欧美一区二区三区在线看| 国产麻豆视频精品| 羞羞漫画18久久大片| 久久久九九九九| 激情丁香综合| 欧美电影在线播放| 日韩亚洲一区在线播放| 亚洲欧美日韩国产综合| 国产精品一区二区在线观看网站| 亚洲综合日韩中文字幕v在线| 欧美在线网址| 亚洲国产精品一区二区www| 免费亚洲一区| 99视频+国产日韩欧美| 午夜精品福利一区二区三区av | 亚洲第一久久影院| 欧美成人午夜视频| 一区二区三区四区在线| 欧美在线视频免费| 欲香欲色天天天综合和网| 欧美高清视频一区| 亚洲一级一区| 久久综合久久久久88| 亚洲免费av电影| 国产欧美精品一区二区三区介绍 | 欧美激情在线| 亚洲欧美另类中文字幕| 欧美/亚洲一区| 亚洲一区日韩在线| 国内在线观看一区二区三区| 欧美激情欧美激情在线五月| 午夜精品www| 亚洲日本电影在线| 久久激情综合| 一本色道久久加勒比88综合| 国产自产v一区二区三区c| 欧美极品在线视频| 欧美一区二区在线视频| 亚洲国产高清在线观看视频| 欧美一区二粉嫩精品国产一线天| 91久久精品日日躁夜夜躁欧美| 欧美偷拍一区二区| 美女露胸一区二区三区| 亚洲专区在线视频| 亚洲精品国产精品国自产观看浪潮| 久久精品盗摄| 亚洲香蕉视频| 99国产精品视频免费观看| 国内成+人亚洲+欧美+综合在线| 欧美日韩国产精品| 看片网站欧美日韩| 久久国产精品亚洲77777| 在线亚洲精品| 亚洲美女精品久久| 欧美激情一区二区三区蜜桃视频| 久久久久国产精品一区三寸| 亚洲免费一在线| 在线一区二区三区四区五区| 亚洲国产精品欧美一二99| 国产亚洲一区二区在线观看| 国产精品欧美风情| 国产精品毛片va一区二区三区| 欧美黄色aaaa| 欧美成人黄色小视频| 另类专区欧美制服同性| 久久精品一区二区三区四区| 欧美一区二区三区四区在线| 亚洲综合第一| 亚洲淫性视频| 午夜精品福利在线观看| 亚洲欧美日韩国产中文在线| 亚洲影视综合| 午夜精品福利电影| 新67194成人永久网站| 亚洲欧美一区二区视频| 亚洲欧美日韩一区二区三区在线观看| 亚洲无线观看| 亚洲欧美日韩国产综合精品二区 | 欧美~级网站不卡| 欧美黑人多人双交| 亚洲高清在线精品| 亚洲日韩视频| 日韩亚洲视频在线| 亚洲五月婷婷| 午夜精品一区二区三区在线播放| 欧美一区二区精品久久911| 香蕉成人久久| 久久久av水蜜桃| 欧美电影免费观看大全| 欧美特黄一级大片| 国产欧美一区二区三区在线老狼| 国产午夜精品麻豆| 精品福利电影| 一区二区三区|亚洲午夜| 亚洲一区二区三区成人在线视频精品| 亚洲综合欧美日韩| 久久久一二三| 亚洲欧洲一级| 亚洲欧美日韩一区在线| 久久久免费精品| 欧美日韩另类在线| 国产欧美日韩精品在线| 亚洲国产精品高清久久久| 一区二区三区四区五区在线| 香蕉精品999视频一区二区 | 久久先锋影音av| 亚洲精品综合久久中文字幕| 亚洲一区免费观看| 欧美www在线| 国产日产精品一区二区三区四区的观看方式 | 欧美一区在线直播| 亚洲成人在线网站| 亚洲一区二区三区影院| 久久在线视频在线| 国产精品久久久久999| 狠狠综合久久| 亚洲深夜福利视频| 欧美成年人网站| 亚洲免费在线视频一区 二区| 蜜臀av在线播放一区二区三区| 国产精品露脸自拍| 亚洲精品久久久蜜桃| 久久久.com| 亚洲午夜精品久久久久久app| 久久中文字幕一区二区三区| 国产精品丝袜白浆摸在线| 亚洲精品国精品久久99热一| 久久精品一区二区三区中文字幕| 99re这里只有精品6|