Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

請問一個C++的問題--member的初始化?

0 views
Skip to first unread message

Mart...@moca.csie.chu.edu.tw

unread,
Dec 6, 2000, 3:00:00 AM12/6/00
to
我寫了一個class,例如:

class test{
public:
test(){
ITEM[0].i=0; ITEM.str="aaaaaaaaaaaaaaaaaaaaaaaaa";
ITEM[1].i=1; ITEM.str="bbbbbbbbbbbbbbbbbbbbbbbbb";
}
private:
struct item{
int i;
char *str;
};
struct item ITEM[2];
};

若於constructor初使化每一個ITEM中的str,
那..,會不會把蓋掉memoey的東西.....(如:aaaaaaaaa...aaa很長,
會蓋掉系統的一些重要部份,而runtime error)

我所不清楚的是,這樣寫constructor,那declare一個test object時,
對於struct中的*str有兩種考量,

1.*str只是一個指向char的pointer,若於constructor
初使化*str,那會不會蓋掉str之後的memoey.

2.於初始化時,會保留空間(看ITEM.str的所接的string是多少就保留多少,
如同宣告char *str2="aaaaaaa...aaaaaa"一樣安全).

哪一個正確ㄋ..,還是都錯誤..,請高人指點迷津....
(PS.我試了以類似的例子,run time都正常啦,不過這也不表示沒問題,
也許是幸運沒遇到吧!)

還有另一個問題,若想初始化一個class的member時,一定要在constructor嗎?
還是有其他方法.我試過宣告成static與const都不行說...

Thank you..
--
[1;32m※ Origin: [33m摩卡小築 [37m<moca.csie.chu.edu.tw> [m
[1;31m◆ From: [36mdialup-143.ts.chu.edu.tw [m

小馬

unread,
Dec 6, 2000, 3:00:00 AM12/6/00
to
※ 引述《Mart...@moca.csie.chu.edu.tw》之銘言:

> 我寫了一個class,例如:
> class test{
> public:
> test(){
> ITEM[0].i=0; ITEM.str="aaaaaaaaaaaaaaaaaaaaaaaaa";
> ITEM[1].i=1; ITEM.str="bbbbbbbbbbbbbbbbbbbbbbbbb";

> 哪一個正確ㄋ..,還是都錯誤..,請高人指點迷津....
> (PS.我試了以類似的例子,run time都正常啦,不過這也不表示沒問題,
> 也許是幸運沒遇到吧!)

public:
test() {
Item[0].i =0; ITEM[0].str = new char[strlen("aaaaaaa") + 1];
strcpy(ITEM[0].str, "aaaaaaa");
....
}

1. 指標一定要有所指 (ex: 指向動態配置好的記憶體空間) 才能使用。
2. 字串得用 strxxx() 等函式去處理。

這兩點不管是學 C 或 C++ 都一樣重要。
--

mbox: m...@im.fju.edu.tw
Web : http://mmlab.im.fju.edu.tw/~maa
--
[1;32m※ Origin: [33m謠 言 報 [37m<bbs.csie.fju.edu.tw> [m
[1;31m◆ From: [36mTS2-PPP-06.fju.edu.tw [m

小豆豆

unread,
Dec 6, 2000, 11:45:21 PM12/6/00
to
※ 引述《Mart...@moca.csie.chu.edu.tw》之銘言:
> 我寫了一個class,例如:
> class test{
> public:
> test(){
> ITEM[0].i=0; ITEM.str="aaaaaaaaaaaaaaaaaaaaaaaaa";
> ITEM[1].i=1; ITEM.str="bbbbbbbbbbbbbbbbbbbbbbbbb";
> }
> private:
> struct item{
> int i;
> char *str;
> };
> struct item ITEM[2];
> };
> 若於constructor初使化每一個ITEM中的str,
> 那..,會不會把蓋掉memoey的東西.....(如:aaaaaaaaa...aaa很長,
> 會蓋掉系統的一些重要部份,而runtime error)
> 我所不清楚的是,這樣寫constructor,那declare一個test object時,
> 對於struct中的*str有兩種考量,
> 1.*str只是一個指向char的pointer,若於constructor
> 初使化*str,那會不會蓋掉str之後的memoey.
> 2.於初始化時,會保留空間(看ITEM.str的所接的string是多少就保留多少,
> 如同宣告char *str2="aaaaaaa...aaaaaa"一樣安全).
> 哪一個正確ㄋ..,還是都錯誤..,請高人指點迷津....
> (PS.我試了以類似的例子,run time都正常啦,不過這也不表示沒問題,
> 也許是幸運沒遇到吧!)
不會,你宣告的"aaaaaaaa"字串
當你把執行程式的時候他就已經在記憶體裡面了
你可以把的ITEM.str1值印出來看,你會發現他每次都會指向相同的記憶體位址
而且是指向程式記憶體
也就是說,這個字串只會被產生一次,而且不能修改
如果寫成這樣的話 str1[]="aaaaaaaa"
這時候,初始化的時候就會產生記憶體位置
並且把"aaaaaaaa"的內容copy過去
把str1印出來看你會發現他指向一般的記憶位置
也就是說,你可以對他做存取的動作
而且,每次初始化的時候就會佔用新的記憶體
> 還有另一個問題,若想初始化一個class的member時,一定要在constructor嗎?
> 還是有其他方法.我試過宣告成static與const都不行說...
> Thank you..
看不懂ㄟ
--
[1;32m┌───── [33m◆ [37mKKCITY [33m◆ [32m─────┐ [34m┐┌┐┐┌┐┌─┐┌┬┐┌┬┐┐ ┌ [m
[1;32m│ [31m bbs.kkcity.com.tw [32m│ [37m├┘┐├┘┐│ │ │ └┬┘ [m
[1;32m└── [34m《 [0;37mFrom:210.201.121.237 [1;34m》 [32m──┘ [36m┘ ┘┘ ┘└─┘└┴┘ ┴ ┴ [m

dancer

unread,
Dec 8, 2000, 3:00:00 AM12/8/00
to
※ 引述《ll...@kkcity.com.tw (小豆豆)》之銘言:

我也看不懂耶
初始化的動作蓋掉memory重要的東西
都才剛開始那來重要的東西?

看看我這樣回答有沒有你想要的
a、字串的處理
char *text;
在run time時想改變所指字串的內容
*text="aaa";
*text="aaabbb";
其中text是static variable
"aaa","aaabbb"是dynamic variable
而且三者所佔用的位址空間均不同…所以不會有〞蓋掉〞的情況


b、陣列的處理
int a[10];
假設我們run time時想改變陣列的大小,例如:
a[20]=256;
這時可能會發生什麼事?
1、忽略這行述敘,throw expection
2、〞蓋掉〞重要的東西

這是唯一可能會發生〞蓋掉〞的情況


--
[1;32m※ Origin: [33m台灣科大電子站 [37m<bbs.et.ntust.edu.tw> [m
[1;31m◆ From: [36m140.118.234.53 [m

dancer

unread,
Dec 8, 2000, 3:00:00 AM12/8/00
to
> a、字串的處理
> char *text;
> 在run time時想改變所指字串的內容
> *text="aaa";
> *text="aaabbb";
> 其中text是static variable
> "aaa","aaabbb"是dynamic variable
> 而且三者所佔用的位址空間均不同…所以不會有〞蓋掉〞的情況

忘了說這是C中的情況

0 new messages