当前位置: 首页 > news >正文

c++ 的拷贝构造函数

当类成员变量有指针类型的时候,要自定义拷贝函数,不要使用默认的拷贝构造函数.因为默认的拷贝构造构造函数是浅拷贝是位拷贝的,只拷贝指针指向的空间而没有把空间里的内容一起拷贝过来,这样会导致改变其中的一个,另一个也会跟着一起改变(老婆也都一样的了)class Teacher

{
public:
Teacher(); // 自定义的无参构造函数
Teacher(string n, double a, string ad, char* work); // 自定义的无参构造函数
Teacher(const Teacher & other); //声明拷贝构造函数 other可不写; 必须要const 和引用&
void eat();
void sleep();
void setname(); //设置人名
void getname() const;
void setwork(char* work);
private:
char work; //指针
Teacher::Teacher():name("abd"), age(36), adrr("湖南省长沙市") //自定义无参构造函数初始化变量
{
work = new char[WORK_LEN]; //分配内存空间
strcpy_s(this->work,WORK_LEN,"山江");
}
Teacher::Teacher(string n, double a, string ad, char
work) : name(n), age(a), adrr(ad) //带参数的构造函数
{
work = new char[WORK_LEN]; //分配内存空间

if (work)
{strcpy_s(this->work, WORK_LEN, work);
}
else
{strcpy_s(this->work, WORK_LEN, "山江");
}

}

Teacher::Teacher(const Teacher& other):name(other.name),age(other.age),
adrr(other.adrr) //拷贝构造函数的实现
{
work = new char[WORK_LEN]; //重新分配空间关键()
strcpy_s(work, WORK_LEN, other.work); //other.work 形参

}
void Teacher::setwork(char * work) //设置工作
{
if (!work) //如果为空
{
return;
}
strcpy_s(this->work, WORK_LEN, work);
}
int main(void)
{

Teacher ls1;    //定义了一个老师1 ,此时的直接调用你自定义无参构造函数初始化变量
Teacher ls4 (ls1);	                 //这个时候会调用拷贝构造函数
cout << "没有做深拷贝ls1\n";
ls1.getname();
ls4.getname();cout << "做深拷贝ls1\n";
ls1.setwork((char*)"麻冲");
ls1.setname();
ls1.getname();
ls4.getname();
system("pause");     //控制台暂停
return 0;

}
ls1.setwork((char*)"麻冲"); 即使工作改了,ls2的工作也不会改变,因为已经做做了深拷贝处理

http://www.wxhsa.cn/company.asp?id=3165

相关文章:

  • 变异
  • 【笔记】类欧几里得算法
  • AQS的一些思考
  • DearPyGui-最强大的一款Python GUI工具
  • 2 模型评估与选择
  • TY-290ES计算器屏幕逆向
  • CF1559E
  • 笔记 哈希
  • 题解:CF566A Matching Names
  • Tarjan 求连通性相关
  • 暑假学习笔记
  • qoj #8557. Goldberg Machine 题解
  • centos7云主机磁盘清理过程纪要
  • 『随笔』我的唱歌练习史
  • 2025浙江省信息通信业职业技能竞赛-数据安全管理员竞赛-决赛wp
  • Java基础核心问题解析
  • 2025年浙江省信息通信业职业技能竞赛-数据安全管理员竞赛-初赛WriteUp
  • 九三阅兵实时记录+次日补
  • 铸网-2025”山东省工业互联网网络安全职业技能竞赛wp(职工组)
  • 视洞R33定制版改造自制IPC网络摄像头(可rtsp可web)
  • 二十一、流水线的冒险与处理
  • java线程的一些思考
  • 2025智能数据分类分级产品选型指南:构建数据治理的智能基座
  • 这是我的第一个博客
  • eqw
  • 2.第一个c语言项目
  • GitHub Copilot 2025年8月最新更新!
  • NOIP 模拟赛十五
  • 面试必备进程调度:fg,bg,jobs,ctrl+z,
  • 完整教程:计算机毕设 java 多媒体教室管理系统 基于 Java+SSM 的多媒体教室运维平台 Java+MySQL 的教室预约与设备管理系统