2017-01-01 100 views
-2

我想知道爲什麼下面的代碼是這樣工作的:我在一個類中有char*成員字段。當我創建此類的一個對象,然後創建第二個對象,然後將第二個對象分配給第一個對象時,第一個對象中類成員的更改應影響第二個對象中的更改。爲什麼價值觀不同?C++ char *作爲類成員

class A{ 
public: 
    char* word; 
    int* number; 
    A(){ 
     word = new char[100]; 
     number = new int; 
    } 
}; 


int main() 
{ 
    char* a = "lala"; 
    char* b = "baba"; 

    A a1; 
    a1.word = a; 
    *(a1.number) = 23; 
    A a2; 
    a2 = a1; //After that pointers should point to the same address, because a2.word = a1.word 

    a2.word = b; 
    *(a2.number) = 10; 

    cout << a1.word << endl << a2.word << endl; 
    cout << *(a1.number) << endl << *(a2.number) << endl; 


    return 0; 
} 

指針的理論認爲結果應該是:

Sample2 
Sample2 
10 
10 

但結果是:

Sample1 
Sample2 
10 
10 

對於int*作爲類成員的行爲就像是理論提示。

+1

你沒有使用'a1'和'a2'的指針 - 'a2 = a1;'創建'a1'的副本並將它指定給'a2',它們不指向同一個對象 – UnholySheep

+2

Any不使用字符串的好理由? – AntoineB

+0

將成員變量設爲公共也不是一個好主意。用getters和setter代替 –

回答

3

當你第一次分配a2 = a1,兩個指針指向相同的字符串(sample1)

但是你a2.word = sample2後,你改變的指針之一,但不改變其他指針。

你會得到你的預期,如果你複製,而不是分配給指針字符串結果:

std::strcpy(a2.word, sample2); 

這也將改變sample1,因爲這就是a1.worda2.word點。因此,這相當於

std::strcpy(sample1, sample2); 
1

您沒有改變指向的值。你正在改變指針。

1

你的兩個實例a1a2不受指針refered來。 因此a2 = a1;創建了a1的副本並將其分配給a2 - >它們不引用同一個對象。

所以,當你做a2.word = sample2;a2對象,它如前所述改變word指針是從a1對象不同一步

1

步驟:

A a1; 
a1.word = sample1; 

a1.word現指向sample1

A a2; 
a2 = a1; //After that pointers should point to the same address, because a2.word = a1.word 

您的評論是正確的,現在a2.word指向sample1

a2.word = sample2; 

現在a2.wordsample2。上面的任務不會複製sample2而不是sample1,它會使a2.word指向sample2