• <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>
            posts - 195,  comments - 30,  trackbacks - 0
            例如:
            class ObjectB{};

            class ObjectA{
            public:
                ObjectB array[5];//對象數(shù)組作為類的成員
            }

            那樣的話對象數(shù)組的初始化會變得很麻煩,
            因為數(shù)組名不能作為左值,所以不可以指針傳遞的方式賦值。
            而且不能通過參數(shù)列表(構(gòu)造函數(shù)后面加一個冒號)的方式初始化,
            所以只能讓類ObjectA自動調(diào)用類ObjectB的無參構(gòu)造函數(shù).
            ---------------
            #include <iostream.h>
            #include 
            "stdlib.h"
            class   ObjectB{
            public:
                
            int a;
            public:
                ObjectB(
            int m=0)
                
            {
                    a
            =m;
                }

            }
            ;
            class   ObjectA
            public:
                    ObjectB   Array[
            5]; 
            public
                    ObjectA(
            int   *p)
                    
            {
                        Array[
            0]=ObjectB(p[0]);
                        Array[
            1]=ObjectB(p[1]);
                        Array[
            2]=ObjectB(p[2]);
                    }
             
            }
            ;

            int main()
            {
                
            int p[5]={0,2,2,3,4};
                ObjectA am
            =ObjectA(p);
                cout
            <<am.Array[1].a<<endl;
                
            return 0;
            }

            ---------------

            我們可以使用替代方式:
            class A{};

            classB{
            public:
                A*a;//A類型的指針作為類的成員
            }
            同樣帶來很大的問題,
            (1)淺拷貝,深拷貝的問題,除非重載拷貝構(gòu)造函數(shù),類B才能實現(xiàn)深拷貝,因為成員中有指針,所以無法簡單的用拷貝構(gòu)造函數(shù)生成一個新對象,而用無參構(gòu)造函數(shù)生成的新對象也會有問題,因為里面的指針一般都默認(rèn)為NULL了。

            重載拷貝構(gòu)造函數(shù)的時候需要申請一定長度的內(nèi)存,將拷貝對象的指針?biāo)赶虻目臻g拷貝到新申請的空間,再進(jìn)行操作。注意申請后要釋放。
            一個拷貝構(gòu)造函數(shù)的例子
            SparseMatrix::SparseMatrix(const SparseMatrix&s)
                
            {
                  Rows
            =s.Rows;
               Cols
            =s.Cols;
               Count
            =s.Count;
               smArray
            =new Trituple[6];
            //此處還需要復(fù)制對象
                }


            ----------------------
            補充知識:
            ------------------http://www.ksarea.com/articles/20070829_memory-partition-stack-heap-difference.html

            C/C++應(yīng)該是大學(xué)里最先接觸的編程語言,它們的重要性不言而喻。但是我始終抱著“數(shù)組名就是指針”的錯誤信條到現(xiàn)在,可能是因為大學(xué)老師錯誤的講解使我一直保留著這種誤解。指針是C/C++語言的特色,而數(shù)組名與指針有太多的相似,甚至很多時候,數(shù)組名可以作為指針使用,所以也難免在學(xué)習(xí)中將兩者混淆。這里介紹下指針和數(shù)組名的區(qū)別:

            1.指針和數(shù)組名占據(jù)的內(nèi)存空間大小不一樣,如下程序1:

            char str[10];
            char *pstr=str;
            cout<<
            cout<<sizeof

            第一行輸出結(jié)果是:10,第二行輸出結(jié)果是:4

            從這里我們可以看出:數(shù)組名對應(yīng)著(而不是指向)一塊內(nèi)存(數(shù)組所占的內(nèi)存區(qū)域)或者說是指代數(shù)組這種數(shù)據(jù)結(jié)構(gòu),其地址與容量在生命期內(nèi)保持不變,只有數(shù)組的內(nèi)容可以改變。指針對應(yīng)著一個占據(jù)4個字節(jié)(Win32)的內(nèi)存區(qū)域,而指向這4個字節(jié)所存儲的地址所對應(yīng)的內(nèi)存單元,它可以指向任意類型的內(nèi)存塊。因此,sizeof(str)值為數(shù)組占據(jù)的內(nèi)存空間大小即10個字節(jié),而sizeof(pstr)值為指針的值占據(jù)的內(nèi)存空間大小即4個字節(jié)。

            2.數(shù)組名不是指針,但是在一定的情況下轉(zhuǎn)換為指代數(shù)組的首地址的指針,而這個數(shù)組名轉(zhuǎn)為的指針只能是指針常量。
            在以下兩種情況下才能進(jìn)行這種轉(zhuǎn)換:
            a.在程序1第二行代碼中,將數(shù)組名直接賦值給指針,此時數(shù)組名轉(zhuǎn)換為指向數(shù)組的首單元的常量指針。
            b.直接將數(shù)組名作為指針形參的時候,數(shù)組名則轉(zhuǎn)換為指向數(shù)組的首單元的常量指針進(jìn)行傳遞,如下程序2:

            void fun(char str[])
            {
            cout<<
            str++;
            }
            void main()
            {

            char str1[5];
            fun(str1);

            }

            注意:數(shù)組名作為函數(shù)形參進(jìn)行傳遞時,在子函數(shù)體內(nèi),它已經(jīng)不再是一個指針常量,而是變成一個真正的指針,可以進(jìn)行增減等操作,可以被修改。所以程序2中子程序第一條語句輸出的sizeof(str)的值為4.

            既然數(shù)組名可以被看作指針常量,而常量是不能修改的,那么如下代碼是不允許的:

            char str[10];
            str++;

            但如下代碼則合法的:

            char str[10];
            char *pstr=str;
            pstr++;

            3.使用指針訪問數(shù)組和使用數(shù)組名訪問數(shù)組本質(zhì)不同。
            例如:

            char str[7]=”ksarea”;
            char *pstr=str;
            cout<<<


            其中str[3]和pstr[3]返回的都是字符’r',但是編譯器產(chǎn)生的執(zhí)行代碼卻不一樣。對于str[3],執(zhí)行代碼是從str開始,向后移動兩個字節(jié),然后取出其中的字符;而對于pstr[3],執(zhí)行代碼是從pstr中取出地址,然后在其上加3,然后取出對應(yīng)內(nèi)存中的字符。當(dāng)然,如果pstr是指向int型的指針,那么pstr[3]的處理過程是從pstr中取出地址,然后在其上加上3*sizeof(int),最后取出對應(yīng)內(nèi)存中的字符,其他的數(shù)據(jù)類型一次類推。
            posted on 2011-02-14 01:08 luis 閱讀(6558) 評論(0)  編輯 收藏 引用 所屬分類: 格式.輸入輸出.數(shù)據(jù)類型
            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            友情鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久人与动人物a级毛片| 国产一久久香蕉国产线看观看| 国产成人精品久久综合| 久久精品国产一区二区电影| 午夜视频久久久久一区 | 91久久精品视频| 久久无码精品一区二区三区| 无码日韩人妻精品久久蜜桃 | 99久久精品免费看国产| 日本精品久久久久久久久免费| 亚洲精品午夜国产va久久| 久久久久久狠狠丁香| 国产精品美女久久久久AV福利| 精品一区二区久久| 亚洲va久久久久| 国产ww久久久久久久久久| 久久午夜免费视频| 99久久99久久精品国产片| 久久人人爽人人爽人人片AV不| 欧美精品一本久久男人的天堂| 亚洲国产成人精品女人久久久 | 国产午夜精品理论片久久影视| 久久久精品国产Sm最大网站| 99国产精品久久| 亚洲日韩中文无码久久| 久久亚洲高清综合| 亚洲国产精品久久久久| 国内精品久久久久久久97牛牛| 亚州日韩精品专区久久久| 精品久久久无码中文字幕| 国产精品久久久久久久久鸭| 亚洲日本va中文字幕久久| 久久久久亚洲AV成人网人人网站 | 亚洲欧美日韩久久精品| 精品久久久久中文字幕一区| 国产91色综合久久免费| 久久久久人妻精品一区| 久久久精品国产sm调教网站 | 91麻豆精品国产91久久久久久| 国产精品无码久久综合| 久久国产乱子精品免费女|