close
C++進階用法

1.

#include <iostream.h>

void main()

{

    int i=3,j=5;



    if ((i=3)||(j=6)){

   cout <<"i="<<i<<" j="<<j;}

}

Q: What is the output?   i=??  j=??



解答1:



第一題的答案是  i=3 j=5,並不會執行 j=6 這個給定值,由於C++是左手邊優先(Left hand side),所以當OR( || )給值出現的時候,所出現的就是第一個成立就不再往下看。所以並不會執行到 j=6 自然而然 j=5



2.

#include <iostream.h>



class C1

{

     public:

     int i;

     C1( ){   cout <<"1--------"<<endl;}

    ~C1( ){  cout <<"2--------"<<endl;}

};

class C2

{

    public:

    int i;

    C2(){   cout <<"3--------"<<endl;}

    ~C2( ){cout <<"4--------"<<endl;

}

};

int fun1( )

{

      static C2 aa;

      C1( );

      cout <<"test_function--------"<<endl;

}

void main()

{

    int x=0;

    C1 c;

    C2 * v;

    cout <<"test1--------"<<endl;

    //*v=C2( );   

    v=&C2( );

    cout <<"test2--------"<<endl;

     fun1( );

     v->i =111;

      cout <<v->i<<endl;



}

Q: What is the output?  



解答2:

   1---------

   test1-----

   3---------

   4---------

   test2-----

   3--------

   1--------

   2--------

   test_function----------

   2---------

   4---------
 

在類別的建構者函數與解構者函數之中,會呼叫到建構者函數就是當物件成立的時候,所以當 C1  c; 的時候就會呼叫 C1 的建構者函數。但是 在建立類別指標的時候(物件指標)並不會呼叫建構者函數與解構者函數,反倒是在指向位址時所使用的  C2( ) 所代表的就是將『類別當成靜態函數來使用』這樣一來可以讓指標去指定該物件,但是由於是當成函數使用所以 C2的建構者函數與解構者函數都會一併執行。而在Scope方面,由於 Static 的Scope 是最大的,所以相對的解構者函數也會比較慢出現∼∼∼

*v=C2()與 v=&C2()的差異

差異如下:

基本上

int x=10;

int *v;

*v=x;

此時由於 v尚未給值, 所以 *v 給定x時,會發生不可預知的錯誤
所以一開始在初始化指標的時候,都應該給定一個位置
v=&x 才能將位址給v
而 *v 才能找到 x
而不是不可預知的位置
*v=x與 v=&x 是完全不同的
x, &x, v, *v, &v 這幾個的意義:
compile 後,
x 會有一個 int 大小的記憶體, 內容是 10, &x 是 x 的記憶體位址 (address)
v 是一個 pointer, 要指向一個 int 大小的記憶體位址,
&v 是 v 的記憶體位址, *v 是 v 所指向的那個記憶體位址的內容, int *v 後, 系統只給 v 一個 pointer 大小的記憶體, v 所指向的位址並沒有給..., 你沒有指定 v 指向某塊記憶體, 卻要更改這個 "某塊記憶體內容", int *v 讓 v = 一個未知的記憶體位址 (也許是系統 address 0x0000??), 也就是 v 指到一個未知的記憶體, 而你用 *v = x, 要強迫更改這個未知記憶體的內容, 你要把 address 0x0000?? 的內容變成 10, 當然是錯誤!!! 因為 address 0x0000?? 的位置並不是你的程式可以存取的地方.... 而 v = &x, 是指定 v 的內容為 x 的 address, 也就是 v 指向 x 這個己經被系統配置的記憶體位置, 它是真實被 x 宣告可使用的, *v = 5 這時所更改的, 也就是 x 的內容...


3.

          Static     i;

          Global   j;

Q: What is difference between i,j?? and what is difference between Static and Global??



解答3:

在Scope方面,大家都知道 Static 與 Global的用法,就是比起一般區域變數的Scope都還大,但是這兩個到底有什麼差距呢?原來,比起來Global比Static 更廣大的Scope,也就是 Static 代表該變數的 Scope範圍到『整個檔案』,但是 Global卻是橫跨數個檔案,皆可以呼叫Global的參數(只要使用 extern來呼叫即可∼∼∼)所以大家都會忘記,其實 Global的範圍才最大,但是記得使用外部檔案的變數還是要宣告一下。


4.
       string s1("test1");
       string s2("test2~~~");

       string & rs=s1;
       string * ps=&s1;
       cout <<"rs1="<<&rs<<" ps1="<<*ps;
       rs=s2;             //Label 1
       ps=&s2;         //Label 2
       cout <<"rs2="<<&rs<<" ps2="<<*ps;

Q: What is the output aboute between Label1 and Label2?

解答4:

這一題只要是在考『指標』(pointer)與『物件化身』(reference)兩者的差別,根據去查書『More Effective C++』裡面有提到,其實兩者用法很像,確有以下的不同

    * Reference 沒有空值(NULL)存在

    * Pointer 的位置可以變動而 Reference 則否

所以以上的題目中 rs =s2 是將 s1中的值改為 s2的數值,而 ps=&s2 則是將指標 ps 指向 s2而已罷了∼∼∼
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()