[英]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.name
和p1.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.