簡體   English   中英

C ++中默認副本構造函數的怪異行為

[英]Weird behavior of default copy constructor in C++

在學習C ++中的隱式副本構造函數期間,我遇到了一個奇怪的行為。 這是關於這堆代碼的:

#include <iostream>

class Person
{
public:
    char* name;
    int age;

    Person( const char* the_name, int the_age )
    {
        name = new char[strlen( the_name ) + 1];
        strcpy( name, the_name );
        age = the_age;
    }

    ~Person()
    {
        delete[] name;
    }
};

int main(){
    Person p1( "Tom", 22 );

    Person p2( p1 );
    p2.name = "Bill";

    // the output is: "Tom"
    std::cout << p1.name << std::endl;

    std::cin.get();
}

默認情況下,復制對象意味着復制其成員,因此,在使用默認復制構造函數創建p2對象時,它應僅復制一個指針name ,而不是其指向的字符數組。 因此,改變name對象的成員p2應該更改name對象的成員p1 於是p1.name應該是"Bill"而不是"Tom"

我的推理有什么問題? 為什么要打印"Tom"

默認情況下,復制對象意味着復制其成員

是。

因此,在使用默認復制構造函數創建p2對象時,它應該僅復制一個指針name ,而不復制其指向的字符數組。

正確。

因此,更改對象p2的名稱成員應更改對象p1的名稱成員。

不。 是的, p2.namep1.name指向同一個內存位置,但這並不意味着改變的指針 p1.name會改變的價值p2.name 如果那是int s,如果更改p1.name無效p2.name ,您會感到驚訝嗎? 因為這是同一件事。 您有兩個不同的變量,更改一個變量的值不會更改另一個變量的值。

int a = 0;
int b = 1;

int* ptrA = &a;
int *ptrA2 = &a;

*ptrA = 1; // now a == 1
*ptrA2 = 4; // now a == 4

ptrA2 = &b;

*ptrA2 = 10; // now b == 10
*ptrA = 3; // now a == 3, a != 10  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM