文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中拷贝构造函数的使用

2024-04-02 19:55

关注

拷贝构造函数

拷贝构造函数,它只有一个参数,参数类型是本类的引用。
复制构造函数的参数可以是 const 引用,也可以是非 const 引用。 一般使用前者,这样既能以常量对象(初始化后值不能改变的对象)作为参数,也能以非常量对象作为参数去初始化其他对象。一个类中写两个复制构造函数,一个的参数是 const 引用,另一个的参数是非 const 引用,也是可以的。

1. 手动定义的拷贝构造函数

Human.h

#pragma once
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;

class Human {
public:		
	Human();
	Human(int age, string name, string sex);
	//手动定义了一个拷贝构造函数
	Human(const Human &other);

	string getName() const;
	string getSex() const;
	int getAge() const;
	void description() const;	//描述信息
private:		
	string name;	//姓名
	string sex;		//性别
	int age;		//年龄
};

Human.cpp

#include "Human.h"

Human::Human() {
	
}

Human::Human(int age, string name, string sex) {
	this->name = name;
	this->sex = sex;
	this->age = age;
}

//拷贝构造函数
Human::Human(const Human& other){
	//把other对象的数据拷贝到另一个对象的私有数据
	this->name = other.name;
	this->sex = other.sex;
	this->age = other.age;
}

string Human::getName() const {
	return name;
}

string Human::getSex() const {
	return sex;
}

int Human::getAge() const {
	return age;
}

void Human::description() const {
	cout << "姓名: " << getName() << endl;
	cout << "年龄: " << getAge() << endl;
	cout << "性别: " << getSex() << endl;
}

main.cpp

#include "Human.h"

Human::Human() {
	
}

Human::Human(int age, string name, string sex) {
	this->name = name;
	this->sex = sex;
	this->age = age;
}

//拷贝构造函数
Human::Human(const Human& other){
	//把other对象的数据拷贝到另一个对象的私有数据
	this->name = other.name;
	this->sex = other.sex;
	this->age = other.age;
}

string Human::getName() const {
	return name;
}

string Human::getSex() const {
	return sex;
}

int Human::getAge() const {
	return age;
}

void Human::description() const {
	cout << "姓名: " << getName() << endl;
	cout << "年龄: " << getAge() << endl;
	cout << "性别: " << getSex() << endl;
}

2. 合成的拷贝构造函数

当程序员没有定义拷贝构造函数时, 编译器会自动生成合成的拷贝构造函数

说明:
合成的拷贝构造函数的缺点: 使用“浅拷贝”

在这里插入图片描述

解决方案:在自定义的拷贝构造函数中,使用‘深拷贝

Human.h

#pragma once
#include <string>
#include <iostream>
#include <Windows.h>
using namespace std;

class Human {
public:		
	Human();

	//定义了一个拷贝构造函数
	Human(const Human & man);

	string getName() const;
	string getSex() const;
	int getAge() const;
	const char* getAddr();
	void setAddr(char* addr);	//设置地址

private:		
	string name;	//姓名
	string sex;		//性别
	int age;			//年龄
	char* addr;		//地址
};

Human.cpp

#include "Human.h"
#define		ADDR_LEN		64

Human::Human() {
	name = "无名";
	sex = "未知";
	age = 18;

	const char* addr_s = "China";
	addr = new char[ADDR_LEN];
	strcpy_s(addr, ADDR_LEN, addr_s);
}

//拷贝构造函数
Human::Human(const Human& other){
	cout << "调用拷贝构造函数" << endl;
	//把other对象的数据拷贝到私有数据
	this->name = other.name;
	this->sex = other.sex;
	this->age = other.age;

	//使用深拷贝, 单独分配一个内存
	this->addr = new char[ADDR_LEN];
	strcpy_s(this->addr, ADDR_LEN, other.addr);
}

string Human::getName() const {
	return name;
}

string Human::getSex() const {
	return sex;
}

int Human::getAge() const {
	return age;
}

const char* Human::getAddr(){
	return addr;
}

void Human::setAddr(char* addr){
	if (!addr) 	return;
	strcpy_s(this->addr, ADDR_LEN, addr);
}
#include "Human.h"
using namespace std;

int main(void) {
	Human zhangsan;
	
	//初始化调用拷贝构造函数
	Human lisi = zhangsan;	//自动调用拷贝构造函数

	//赋值的时候调用的是赋值构造函数
	//lisi = zhangsan;

	cout <<"李四地址: " << lisi.getAddr() << endl;
	cout <<"张三地址: " << zhangsan.getAddr() << endl;

	cout << "张三修改地址" << endl;
	zhangsan.setAddr((char*)"美国");

	cout << "李四地址: " << lisi.getAddr() << endl;
	cout << "张三地址: " << zhangsan.getAddr() << endl;

	system("pause");
	return 0;
}

总结

到此这篇关于C++中拷贝构造函数的使用的文章就介绍到这了,更多相关C++拷贝构造函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯