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而已罷了∼∼∼
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而已罷了∼∼∼
全站熱搜