c++构造函数中的指针错误 浅拷贝和位拷贝

首先先定义一个类


// 定义一个“人类”
class Human {
public:  //公有的,对外的
	Human(); //手动定义的“默认构造函数”
	Human(int age, int salary);
	void description();
	void setaddr(const char* addr);

private:
	string name = "Unknown";
	int age = 28;
	int salary;
	char* addr = NULL;//地址

};

接着定义默认构造函数

Human::Human() {//默认的构造函数
	name = "无名氏";
	age = 18;
	salary = 30000;
	cout << "调用默认的构造函数" << endl;

}

定义重载构造函数

Human::Human(int age, int salary) {
	cout << "调用重载构造函数" << endl; 
	this->age = age;      //this是一个特殊的指针,指向这个对象本身
	this->salary = salary;
	name = "无名";
    strcpy_s(addr, ADDR_LEN, "China");
}

定义human描述函数

void Human::description()const {
	cout << "name: " << name;
	cout << " age: " << age;
	cout << " salary: " << salary;
	cout << " addr: " << (addr ? addr : "NULL") << endl;
}

定义setaddr函数更改地址

    
#define ADDR_LEN 64

void Human::setaddr(const char* newAddr) {
	if (!newAddr) {
		return;
	}

	strcpy_s(addr, 64, newAddr);
}

接着在main函数中调用setaddr()

int main(void) {
	Human h1, h2;
	h1.setaddr("新加坡");
	h1.description();
	h2.description();

}

程序执行结果 h1 ,h2 的地址都是新加坡

因为地址都是一样,改变了一个,所有的Human下的addr都会改变

我们需要给addr开辟一个内存来避免这个错误。

Human::Human(int age, int salary)//自定义的重载构造函数
{
	cout << "调用自定义的构造函数" << endl;
	this->age = age;
	this->salary = salary; //this是一个特殊的指针,指向这个对象本身
	this->name = "无名";

	addr = new char[ADDR_LEN];
	strcpy_s(addr, ADDR_LEN, "China");
}
void Human::setaddr(const char* addr) {
	if (!addr) {
		return;
	}
	
	 this->addr = new char[ADDR_LEN];
	 
	 strcpy_s(this->addr, ADDR_LEN, addr);
	 
	 
}

你可能感兴趣的:(c++)