您現(xiàn)在所在的位置:首頁 >學(xué)員就業(yè) > 就業(yè)寶典 > 經(jīng)典C++面試題,看看你會多少?(二)

經(jīng)典C++面試題,看看你會多少?(二)

來源:奇酷教育 發(fā)表于:

題目(六):運(yùn)行下列C++代碼,輸出什么?structPoint3D{intx;inty;intz;};int_tmain(intargc, _TCHAR* argv[]){Point3D* pPoint = NU

題目(六):運(yùn)行下列C++代碼,輸出什么?

struct Point3D

{

        int x;

        int y;

        int z;

};

 

int _tmain(int argc, _TCHAR* argv[])

{

        Point3D* pPoint = NULL;

        int offset = (int)(&(pPoint)->z);

 

        printf("%d", offset);

        return 0;

}

答案:輸出8。由于在pPoint->z的前面加上了取地址符號,運(yùn)行到此時的時候,會在pPoint的指針地址上加z在類型Point3D中的偏移量8。由于pPoint的地址是0,因此最終offset的值是8。

&(pPoint->z)的語意是求pPoint中變量z的地址(pPoint的地址0z的偏移量8),并不需要訪問pPoint指向的內(nèi)存。只要不訪問非法的內(nèi)存,程序就不會出錯。

題目(七):運(yùn)行下列C++代碼,輸出什么?

class A

{

public:

        A()

        {

                Print();

        }

        virtual void Print()

        {

                printf("A is constructed.\n");

        }

};

 

class B: public A

{

public:

        B()

        {

                Print();

        }

 

        virtual void Print()

        {

                printf("B is constructed.\n");

        }

};

 

int _tmain(int argc, _TCHAR* argv[])

{

        A* pA = new B();

        delete pA;

 

        return 0;

}

答案:先后打印出兩行:A is constructed. B is constructed. 調(diào)用B的構(gòu)造函數(shù)時,先會調(diào)用B的基類及A的構(gòu)造函數(shù)。然后在A的構(gòu)造函數(shù)里調(diào)用Print。由于此時實(shí)例的類型B的部分還沒有構(gòu)造好,本質(zhì)上它只是A的一個實(shí)例,他的虛函數(shù)表指針指向的是類型A的虛函數(shù)表。因此此時調(diào)用的PrintA::Print,而不是B::Print。接著調(diào)用類型B的構(gòu)造函數(shù),并調(diào)用Print。此時已經(jīng)開始構(gòu)造B,因此此時調(diào)用的PrintB::Print。

同樣是調(diào)用虛擬函數(shù)Print,我們發(fā)現(xiàn)在類型A的構(gòu)造函數(shù)中,調(diào)用的是A::Print,在B的構(gòu)造函數(shù)中,調(diào)用的是B::Print。因此虛函數(shù)在構(gòu)造函數(shù)中,已經(jīng)失去了虛函數(shù)的動態(tài)綁定特性。

題目(八):運(yùn)行下列C#代碼,輸出是什么?

namespace ChangesOnString

{

    class Program

    {

        static void Main(string[] args)

        {

            String str = "hello";

            str.ToUpper();

            str.Insert(0, " WORLD");

 

            Console.WriteLine(str);

        }

    }

}

答案:輸出是hello。由于在.NET中,String有一個非常特殊的性質(zhì):String的實(shí)例的狀態(tài)不能被改變。如果String的成員函數(shù)會修改實(shí)例的狀態(tài),將會返回一個新的String實(shí)例。改動只會出現(xiàn)在返回值中,而不會修改原來的實(shí)例。所以本題中輸出仍然是原來的字符串值hello。

如果試圖改變String的內(nèi)容,改變之后的值可以通過返回值拿到。用StringBuilder是更好的選擇,特別是要連續(xù)多次修改的時候。如果用String連續(xù)多次修改,每一次修改都會產(chǎn)生一個臨時對象,開銷太大。

題目(九):C++C#中,structclass有什么不同

答案:C++中,如果沒有標(biāo)明函數(shù)或者變量是的訪問權(quán)限級別,在struct中,是public的;而在class中,是private的。

                C#中,如果沒有標(biāo)明函數(shù)或者變量的訪問權(quán)限級別,structclass中都是private的。structclass的區(qū)別是:struct定義值類型,其實(shí)例在棧上分配內(nèi)存;class定義引用類型,其實(shí)例在堆上分配內(nèi)存。

題目(十):運(yùn)行下圖中的C#代碼,輸出是什么?

namespace StaticConstructor

{

    class A

    {

        public A(string text)

        {

            Console.WriteLine(text);

        }

    }

 

    class B

    {

        static A a1 = new A("a1");

        A a2 = new A("a2");

 

        static B()

        {

            a1 = new A("a3");

        }

 

        public B()

        {

            a2 = new A("a4");

        }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            B b = new B();

        }

    }

}

答案:打印出四行,分別是a1、a3、a2、a4

在調(diào)用類型B的代碼之前先執(zhí)行B的靜態(tài)構(gòu)造函數(shù)。靜態(tài)函數(shù)先初始化類型的靜態(tài)變量,再執(zhí)行靜態(tài)函數(shù)內(nèi)的語句。因此先打印a1再打印a3。接下來執(zhí)行B b = new B(),即調(diào)用B的普通構(gòu)造函數(shù)。構(gòu)造函數(shù)先初始化成員變量,在執(zhí)行函數(shù)體內(nèi)的語句,因此先后打印出a2、a4。

主站蜘蛛池模板: 伊人色综合九久久天天蜜桃| 99久久综合狠狠综合久久止| 狠狠亚洲婷婷综合色香五月排名| 色综合久久综精品| 亚洲一区综合在线播放| 亚洲日韩在线中文字幕综合| 亚洲中文字幕无码久久综合网 | 在线亚洲97se亚洲综合在线| 色诱久久久久综合网ywww| 久久综合日本熟妇| 狠狠色丁香婷婷久久综合不卡| 精品综合久久久久久98| 99久久国产综合精品五月天喷水| 亚洲综合色成在线播放| 91精品国产色综合久久| 久久精品国产亚洲综合色| 久久久久亚洲AV综合波多野结衣 | 欧美久久综合九色综合| 亚洲人成网站999久久久综合| 国产成人亚洲综合网站不卡| senima亚洲综合美女图| 色综合中文综合网| 国产欧美日韩综合| 国产成人精品综合在线观看| 六月婷婷国产精品综合| 狠狠色伊人久久精品综合网| 国产精品国产欧美综合一区| 精品国产国产综合精品| 亚洲综合成人网| 亚洲欧洲日产国产综合网| 亚洲AV综合色区无码一区爱AV| 欧美综合区自拍亚洲综合天堂| 国产成人人综合亚洲欧美丁香花| 色综合天天综合网站中国| 一本大道久久a久久精品综合| 亚洲狠狠婷婷综合久久久久| 国产激情综合在线观看| 久久久久亚洲av综合波多野结衣| 亚洲欧美精品综合中文字幕| 婷婷五月综合丁香在线| 久久综合伊人77777|