题解 | #浅拷贝和深拷贝#

浅拷贝和深拷贝

https://www.nowcoder.com/practice/535753110cbd4e8987adc2e67f392ab7

/*描述
现有一个 Person 类,成员变量:姓名(string name)和年龄(int age),请给 Person 添加一个拷贝构造函数,让程序能够正确运行。
输入描述:
键盘输入用户名和年龄
输出描述:
通过 Person 类的showPerson()成员方法输出 Person 对象的姓名和年龄,中间使用空格隔开*/


#include <iostream>
#include <cstring>

#pragma warning(disable : 4996)
using namespace std;

class Person {

public:
	char* name; // 姓名
	int age;    // 年龄

	Person(const char* name, int age) {
		this->name = new char[strlen(name) + 1];//strlen是一个计数器,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0');指针name指向 char类型、大小为strlen(name) + 1的数组 的首地址.
		strcpy(this->name, name);//strcpy,即string copy(字符串复制)的缩写。strcpy是C++语言的一个标准函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*;
		this->age = age;
	}

	Person(const Person &p) //将拷贝构造函数注释,编译器提供简单的浅拷贝 浅拷贝的简单赋值操作使程序出现堆区内存重复释放问题—— > 运行出错
	{
		this->age = p.age;//编译器默认代码---简单赋值
		this->name = new char[strlen(p.name) + 1];
		strcpy(this->name, p.name);
		//开辟一个新的堆区 存放 拷贝的数据 并将新地址赋值给指针name;
	}// write your code here......


	void showPerson() {
		cout << name << " " << age << endl;
	}

	~Person() {
		if (name != nullptr) {
			delete[] name;
			name = nullptr;
		}
	}

};

int main() {

	char name[100] = { 0 };
	int age;

	cin >> name;
	cin >> age;

	Person p1(name, age);
	Person p2 = p1;

	p2.showPerson();

	return 0;
}

全部评论

相关推荐

StephenZ_:我9月份找的第一段实习也是遇到这种骗子公司了,问他后端有多少人和我说7个正职,进去一看只有一个后端剩下的都是产品前端算法(没错甚至还有算法)。还是某制造业中大厂,我离职的时候还阴阳怪气我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务