先定义一个Human
class Human {
public:
Human();
Human(int age, int salary);
Human(const Human& man);
void setaddr(const char* addr);
const char *getAddr()const;
private:
string name = "Unknown";
int age = 28;
int salary;
char* addr = NULL;
};
实现一下他的成员函数
const char * Human::getAddr ()const {
return addr;
}
Human::Human() {
name = "无名氏";
age = 18;
salary = 30000;
strcpy_s(addr, ADDR_LEN, "China");
}
Human::Human(const Human& man) {
salary = man.salary;
age = man.age;
name = man.name;
addr = man.addr;
}
void Human::setaddr(const char* addr) {
if (!addr) {
return;
}
strcpy_s(this->addr, ADDR_LEN,addr);
}
Human::Human(int age, int salary)
{
this->age = age;
this->salary = salary;
this->name = "无名";
strcpy((char*)addr, "China");
}
Main函数
int main(void) {
Human h1;
Human h2(h1);
cout << "H1:" << h1.getAddr() << endl;
cout << "H2:" << h2.getAddr() << endl;
cout << "h1更改addr后" << endl;
h1.setaddr("Franch");
cout << "H1:" << h1.getAddr() << endl;
cout << "H2:" << h2.getAddr() << endl;
return 0;
}
Main函数
int main(void) {
Human h1;
Human h2(h1);
cout << "H1:" << h1.getAddr() << endl;
cout << "H2:" << h2.getAddr() << endl;
cout << "h1更改addr后" << endl;
h1.setaddr("Franch");
cout << "H1:" << h1.getAddr() << endl;
cout << "H2:" << h2.getAddr() << endl;
return 0;
}
执行结果
出现问题: 明明只更改了h1的addr,但是h2的addr也随着更改,也变成了Franch
这是因为在调用了拷贝构造函数后,h1 h2 的addr 指向同一块内存,h1的addr更改了这一块内存,而h2的addr也是这段内存,所以h1 h2 的addr都随之更改。
解决方案如下:
只需要给addr开辟一个新的内存即可
void Human::setaddr(const char* addr) {
if (!addr) {
return;
}
this->addr = new char[ADDR_LEN];
strcpy_s(this->addr, ADDR_LEN,addr);
}
Human::Human() {
name = "无名氏";
age = 18;
salary = 30000;
addr = new char[ADDR_LEN];
strcpy_s(addr, ADDR_LEN, "China");
}
问题解决