精華區beta TransCSI 關於我們 聯絡資訊
台大90年度轉學考計概第六題 1 #include <iostream> 2 using namespace std. 3 class Ex { 4 public: 5 Ex(){p = new int;} 6 void set(int i){*p = i;} 7 int get(){return *p;} 8 private: 9 int *p; 10 } 11 12 int main(){ 13 Ex test1,test2; 14 test1.set(-1); 15 cout<< test1.get() <<""; 16 test2.set(-2); 17 test1=test2 18 cout<< test1.get() <<""; 19 test2.set(-3); 20 cout<< test1.get() <<endl; 21 return 0; 22 } ===================================== 對類別的看法是→公有的:二個函數set(設值)get(取值)可以給其他使用 私有的: *p 內部自己使用的指標,不被外部程式影響 而我的問題是第17行:test1=test2 這個等號的意義是什麼??? 如果私有的不被外部程式影響,那這個等號應該沒有作用,所以會輸出 -1 -1 -1 如果這裡會影響,傳的是*p的值,那應該會輸出 -1 -2 -2 如果這裡會影響,傳的是p的值 ,那就是 -1 -1 -3 哪個才對呢?我對類別的應用覺得很頭大... 台大90年度轉學考計概第五題 1 #include <iostream> 2 using namespace std; 3 4 int what( const char *s){ 5 int j; 6 for(j=0; *s!='\0'; s++)++j 7 return j; 8 } 9 10 int main(){ 11 char *st={"this is a test."}; 12 cout << what(st); 13 return 0; 14 } 這題的問題是字串的儲存與應用方式 對於第六行的for裡 *s!='\0' s是指字串的開頭位置吧, 所以12行的st就是傳一個位置給what函數, 但是 4行的定義是 const char *s 這不是字串嗎? 傳一個位置過去,卻用字串的定義接受??? 還有,如果第六行的*s是單指一個字母,那怎樣才是整個字串?? 是我的哪個觀念出錯了???請幫忙指正,謝謝回應唷。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.131.77 > -------------------------------------------------------------------------- < 作者: deepdish (要和數學裝熟..) 看板: TransCSI 標題: Re: [問題] 程式:C++ 台大90 第五、六題 時間: Mon May 23 20:29:20 2005 我先處理這題我覺得比較簡單 : 台大90年度轉學考計概第五題 1 #include <iostream> 2 using namespace std; 3 4 int what( const char *s) 5 { 6 int j; 7 for(j = 0; *s != '\0'; s++) 8 ++j; 9 return j; 10 } 11 12 int main() 13 { 14 char *st = {"this is a test."}; 15 cout << what(st); 16 system("pause"); // 這行只是把命令提示字元視窗暫停一下 17 return 0; 18 } : 這題的問題是字串的儲存與應用方式 : 對於第六行的for裡 *s!='\0' s是指字串的開頭位置吧, : 所以12行的st就是傳一個位置給what函數, : 但是 4行的定義是 const char *s 這不是字串嗎? : 傳一個位置過去,卻用字串的定義接受??? 嗯嗯 這很正常阿 傳記憶體位置 也可以定義位置裡面的資料型態 : 還有,如果第六行的*s是單指一個字母,那怎樣才是整個字串?? 14 行是利用雙引號 "" 以字串將指標 *st 初始化 在 main 中 st 就是整個字串 在 what 中 s 就是整個字串 *s 代表指標 如果要知道真正的位置是用 &s -- 歡迎大家一起加入Intel Philanthropic Peer-to-Peer Program !!! 這項「英特爾慈善『點對點連線』計畫」旨在經由網際網路,把數百萬部個人電腦連結 起來,加速研發治療白血球過多症血癌)的藥物,從而把新藥上市的需要時間縮短約 一半。對本計畫有興趣者,可以到http://www.grid.org/download/gold/download.htm 網站,下載該程式。 一旦一批資料處理完畢,下次電腦連接上網際網路時,不論經由寬頻撥接,電腦便會 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.201.17 ※ 編輯: deepdish 來自: 140.115.201.17 (05/23 20:43) ※ 編輯: deepdish 來自: 140.115.201.17 (05/23 20:45) ※ 編輯: deepdish 來自: 140.115.201.17 (05/23 20:46)
Elfiend:感謝,原來指標在字串的意義又不一樣了呀。 220.139.131.77 05/23
> -------------------------------------------------------------------------- < 作者: deepdish (要和數學裝熟..) 看板: TransCSI 標題: Re: [問題] 程式:C++ 台大90 第五、六題 時間: Wed May 25 11:53:04 2005 ※ 引述《Elfiend (小孩)》之銘言: : 台大90年度轉學考計概第六題 1 #include <iostream> 2 using namespace std; 3 4 class Ex 5 { 6 public: 7 Ex() { p = new int; } 8 void set(int i) { *p = i; } 9 int get() { return *p; } 10 private: 11 int *p; 12 }; 13 14 int main() 15 { 16 Ex test1, test2; 17 test1.set(-1); 18 cout << test1.get() << ""; 19 test2.set(-2); 20 test1 = test2; 21 cout << test1.get() << ""; 22 test2.set(-3); 23 cout << test1.get() << endl; 24 system("pause"); 25 return 0; 26 } : ===================================== 程式 run 的結果是 -1 -2 -3 : 對類別的看法是→公有的:二個函數set(設值)get(取值)可以給其他使用 : 私有的: *p 內部自己使用的指標,不被外部程式影響 所以 main 不能直接呼叫 private,但是此程式並沒有看到被直接呼叫的情況 應該只有 16 行宣告物件時有使用到 private 而 public 很明顯可以更動 *p 的值,不受 private 影響 : 而我的問題是第17行:test1 = test2 : 這個等號的意義是什麼??? 等號代表 test1 物件指到 test2 的位置 結果就是兩個物件指到同一位置 所以在這個程式中 test1 的值會等同於 test2 的值 : 如果私有的不被外部程式影響,那這個等號應該沒有作用,所以會輸出 -1 -1 -1 : 如果這裡會影響,傳的是*p的值,那應該會輸出 -1 -2 -2 : 如果這裡會影響,傳的是p的值 ,那就是 -1 -1 -3 : 哪個才對呢?我對類別的應用覺得很頭大... 都不對 > -------------------------------------------------------------------------- < 作者: hsiehwei (開心最重要啦!!) 看板: TransCSI 標題: Re: [問題] 程式:C++ 台大90 第五、六題 時間: Fri Jun 10 21:46:04 2005 ※ 引述《deepdish (要和數學裝熟..)》之銘言: : 我先處理這題我覺得比較簡單 : : 台大90年度轉學考計概第五題 : 1 #include <iostream> : 2 using namespace std; : 3 : 4 int what( const char *s) : 5 { : 6 int j; : 7 for(j = 0; *s != '\0'; s++) : 8 ++j; : 9 return j; : 10 } : 11 : 12 int main() : 13 { : 14 char *st = {"this is a test."}; : 15 cout << what(st); : 16 system("pause"); // 這行只是把命令提示字元視窗暫停一下 : 17 return 0; : 18 } : : 這題的問題是字串的儲存與應用方式 : : 對於第六行的for裡 *s!='\0' s是指字串的開頭位置吧, *s指向字元位址 : : 所以12行的st就是傳一個位置給what函數, : : 但是 4行的定義是 const char *s 這不是字串嗎? : : 傳一個位置過去,卻用字串的定義接受??? : 嗯嗯 這很正常阿 傳記憶體位置 也可以定義位置裡面的資料型態 *s跟*st指向同一個記憶體位址 : : 還有,如果第六行的*s是單指一個字母,那怎樣才是整個字串?? : 14 行是利用雙引號 "" 以字串將指標 *st 初始化 : 在 main 中 st 就是整個字串 : 在 what 中 s 就是整個字串 : *s 代表指標 : 如果要知道真正的位置是用 &s *s是指標(取值),取址用s就可以了 字串(字元陣列): [t][h][i][s][ ][i][s][ ][a][ ][t][e][s][t][\0] '\0'是null字元,表示字串結束 空字元(space)是'\32',ASCII代碼是32或0x20 指標*st指向字串的第一個字元(陣列的第一個元素) 't' 然後把st(位址)傳給*s 所以*s指向 't' s++ 會使*s指向下一個字元 讀到null字元時離開迴圈 cout會輸出字串(字元陣列)中的字元(元素),以null字元判斷字串結束 另外 char st = 'c'; st表值,&st取址 char *st = "c++"; *st或st[]取值,st表址 char st[4] = "c++"; //有一個null字元 st[]或*st取值,st表址 (沒錯,陣列就是指標) st = st[0] st+1 = st[1] st+2 = st[2] st+3 = st[3] 有錯請指正,謝謝 ---- 今天第一次來到這個板 先恭喜開板 嗯... 我是五專生,明年要插大 請多多指教 > -------------------------------------------------------------------------- < 作者: hsiehwei (開心最重要啦!!) 看板: TransCSI 標題: Re: [問題] 程式:C++ 台大90 第五、六題 時間: Fri Jun 10 22:24:29 2005 ※ 引述《deepdish (要和數學裝熟..)》之銘言: : ※ 引述《Elfiend (小孩)》之銘言: : : 台大90年度轉學考計概第六題 : 1 #include <iostream> : 2 using namespace std; : 3 : 4 class Ex : 5 { : 6 public: : 7 Ex() { p = new int; } : 8 void set(int i) { *p = i; } : 9 int get() { return *p; } : 10 private: : 11 int *p; : 12 }; : 13 : 14 int main() : 15 { : 16 Ex test1, test2; : 17 test1.set(-1); : 18 cout << test1.get() << ""; : 19 test2.set(-2); : 20 test1 = test2; : 21 cout << test1.get() << ""; : 22 test2.set(-3); : 23 cout << test1.get() << endl; : 24 system("pause"); : 25 return 0; : 26 } : : ===================================== : 程式 run 的結果是 -1 -2 -3 : : 對類別的看法是→公有的:二個函數set(設值)get(取值)可以給其他使用 : : 私有的: *p 內部自己使用的指標,不被外部程式影響 : 所以 main 不能直接呼叫 private,但是此程式並沒有看到被直接呼叫的情況 : 應該只有 16 行宣告物件時有使用到 private 宣告時,會使用建構函數 預設建構函數為 Ex::Ex(); 動到private成員的也不是main(),是物件本身,Ex::Ex(); : 而 public 很明顯可以更動 *p 的值,不受 private 影響 : : 而我的問題是第17行:test1 = test2 : : 這個等號的意義是什麼??? : 等號代表 test1 物件指到 test2 的位置 : 結果就是兩個物件指到同一位置 : 所以在這個程式中 test1 的值會等同於 test2 的值 設定運算子的原型為 Ex & Ex::operator=(const Ex &); 所以 test1 = test2; 會執行成員對成員的複製 test2::p的內容(位址)會複製到test1::p (test1::*p = test2::p) test1跟test2依然是不同的物件 test1也沒有指到test2 除非 Ex * test = test2; : : 如果私有的不被外部程式影響,那這個等號應該沒有作用,所以會輸出 -1 -1 -1 : : 如果這裡會影響,傳的是*p的值,那應該會輸出 -1 -2 -2 : : 如果這裡會影響,傳的是p的值 ,那就是 -1 -1 -3 : : 哪個才對呢?我對類別的應用覺得很頭大... : 都不對