推 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
: : 哪個才對呢?我對類別的應用覺得很頭大...
: 都不對
台大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)