自定义复制构造函数

C++复制构造函数何时调用?什么时候需要自定义副本构造函数 什么是复制构造函数复制构造函数是一个成员函数,它使用同一个的另一个对象初始化一个对象。函数原型如下: ClassName(const ClassName &old_obj); 下面是一个复制构造函数的简单示例: #include <iostream> using std::cout; class Point { private: int x, y; publi... 阅读详情

小编在编写构造函数之时,想到以前遇到的一个关于构造函数复制的问题,因为同一个类的对象在内存中的有完全相同的结构,如果作为一个整体进行复制或者拷贝是完全可行的,这个拷贝过程是只需要拷贝数据成员,而函数成员是公用的。在建立对象时可用同一类的另一个对象初始化该对象,即复制初始化构造函数。但是当希望从另外一个同类对象处得到部分属性值时,或类的成员数据使用new操作符动态申请存储空间存储数据时,必须在类中自定义一个完成复制功能的构造函数。简单代码如下:#include
#include <string.h>
using namespace std;
class student
{
char * name;
int age;
public:
/student(student &p)
{
if (p.name)
{
age = p.age;
name = new char[strlen(p.name) + 1];
strcpy(name, p.name);
}
else name = 0;
}
/

student(const char * tname, int a)
{
	if (tname)
	{
		age = a;
		name = new char[strlen(tname) + 1];
		strcpy(name, tname);
	}
	else name = 0;
}
~student()
{
	cout << name << "age is" << age << "years old." << endl;
	if (name) delete name;
}

};
int main()
{
student st1(“LIMING”, 20);
student st2(st1);
system(“pause”);
return 0;
}
但是在实际操作中会出现,如下中断程序中断
此中断是由于
~student()
{
cout << name << “age is” << age << “years old.” << endl;
if (name) delete name;
}
中第二次执行析构函数中的delete name;语句时出错;其时对象st2释放时,调用析构函数释放掉动态空间,对象st1释放时,调用析构函数又想释放已被对象st2释放掉的动态对象空间因此出错。纠正为
student(student &p)
{
if (p.name)
{
age = p.age;
name = new char[strlen(p.name) + 1];
strcpy(name, p.name);
}
else name = 0;
}
结果即运行正确。
在这里插入图片描述

Zemax非序列模式新手入门:从零搭建一个抛物面反射镜系统(含灯丝光源与探测器设置) 本文详细介绍了如何在Zemax非序列模式下从零搭建抛物面反射镜系统,包括灯丝光源配置、反射镜建模和探测器设置等关键步骤。通过实战指南,帮助光学设计新手快速掌握非序列模式的应用技巧,特别适合处理复杂光线传播场景如反射镜系统和杂散光分析。 阅读详情

相关推荐

C++复制构造函数

在CSDN论坛中有朋友问到这样一个问题:自定义mystring中,定义了该复制构造函数 mystring::mystring(mystring&another) { if(str!=NULL) delete[]str; str = new char[strlen(another.str)+1]; strcpy(str,another.str); } 而str是mystring的成员变量,其定义为 char* str; 之后在main()函数中,有如下代码 my

hou09tian的博客 1076

学生构造函数

1. 定义一个学生Student,包括:属性学号,姓名,性别,年龄,方法包括构造方法初始化变量;显示学号方法、显示姓名方法、显示性别方法、显示年龄方法、修改年龄方法。 2. 定义一个测试StudentTest创建两个学生对象,John,Mark,通过新建对象传值初始化对象属性,分别显示两个学生的学号,性别,年龄,然后修改John的年龄并显示之。

关于爬虫源影视资源设置

本文介绍了Omnibox 2.1.3版本的爬虫脚本配置方法,重点演示了如何添加猫眼资源数据源。脚本包含完整的API请求处理、数据格式化、视频详情获取和弹幕匹配等功能模块。通过环境变量配置采集站API地址和弹幕API地址,支持视频列表获取、分检索、详情查询和播放地址解析等功能。脚本采用模块化设计,包含完善的错误处理和日志记录机制,能够将采集站返回的数据转换为标准格式,并支持批量获取视频详情来丰富数据。同时提供了弹幕匹配功能,可根据视频文件名或播放地址自动匹配相关弹幕资源。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 4004

构造函数,析构函数,复制构造函数的实例————学生信息录入

【代码】构造函数,析构函数,复制构造函数的实例————学生信息录入。

weixin_73624949的博客 302

C++57个入门知识点_23_ 拷贝构造函数(理解为copy构造;用一个对象创建另一个对象,调用的构造函数即拷贝构造函数;缺省为完全拷贝;手写即CStudent(CStudent& obj) {})

前面学习了构造与析构函数的概念,此处做一复习。 构造函数: 编译器帮你在对象创建调用函数做初始化动作 析构函数: 编译器在对象要死亡的时候帮你调用函数做资源的反初始化动作 那什么是构造函数?带着这个疑问,我们来一步步拨开它神秘的面纱。 1.利用一个对象创建另一个对象 我们已经有了一个创建好的对象,将其赋值给新的对象。 //将stu对象赋值给stu2 似于int n=1;int k=n; CStudent stu2 = stu; #include <iostream> class CStu

分享学习成长历程,Winter is coming! 622

- 复制构造函数

中包含有指针成员,该指针成员指向动态分配的内存(这些内存是在构造函数中使用new分配的,并在析构函数中使用delete进行释放)。复制这个的对象时,将复制其指针成员,但不复制指针指向的缓冲区。其结果是:两个对象指向同一块动态分配的内存。这被称为浅复制,会威胁程序的稳定性! 一个的对象按值传递给一个函数时,源对象的指针成员的指针值被复制到函数中对象的指针成员中,则两个指针成员指向同一个内存

GreatWT的博客 597

C++拷贝构造函数(深拷贝,浅拷贝)

 转自:本Blog停止更新,感谢原作者C++拷贝构造函数(深拷贝,浅拷贝) 对于普通型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而对象与普通对象不同,对象内部结构一般较为复杂,存在各种成员变量。下面看一个对象拷贝的简单例子。 #include iostream>using namespace std;class CExample {pr

Sugar_Tiger[糖伯虎]的专栏 5925

中的拷贝构造函数复制构造函数)浅拷贝--C++学习(6)

复制构造函数深拷贝,浅拷贝区分

qq_40681630的博客 296

何时需要自定义复制构造函数

何时需要自定义复制构造函数

hgdfguj的博客 237

何时需要自定义复制构造函数

本文涉及对象的赋值和复制(也称为克隆)。必要时,先看谭浩强教材P291-295的相关内容或PPT,重温一下有关概念。   一、一般情况   先看一个例子: //例程1 #include using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){r

迂者-贺利坚的专栏 8668

自定义 作为item放入QList中 没有可用的复制构造函数复制构造函数声明为“explicit”

报错: 没有可用的复制构造函数复制构造函数声明为“explicit” 使用方式: QList m_listCity; FourLevelAddressBase//自定义 原因: FourLevelAddressBase中没有拷贝构造函数(也叫做复制构造函数) 解决方法: 在FourLevelAddressBase中添加一个拷贝构造函数即可。

证券指标的专栏 3406

vector装入自定义多个对象的时候复制构造函数参数必须有const修饰

#include #include using namespace std; class A{ private: int value; public: A(){ cout << " constructor " << endl; } A(int n){ value=n; cout << "constructor " << endl; } A(const A &other)

修也 1774

c语言自定义scopy,C++自定义复制构造函数详解

程序员可以定义一个复制构造函数。程序员定义的复制构造函数必须有一个形参,它是对同一个的引用。因此,在前面的例子中,复制构造函数的原型就应该是下面这个样子的:NumberArray :: NumberArray(NumberArray&obj)此复制构造函数通过在复制之前为新对象的指针分配单独的内存来避免默认复制构造函数的问题:NumberArray :: NumberArray (N...

weixin_33239721的博客 723

C++和数据抽象】复制构造函数

C++ 的面向对象编程中,对象的复制是一个核心操作。复制构造函数作为的特殊成员函数,负责从一个已存在的对象创建新对象,确保资源管理的正确性和数据的一致性。

byte轻骑兵的技术小窝 2065

复制构造函数

一、声明复制构造函数 二、定义复制构造函数 说明:如果用户自己未定义复制构造函数,系统会提供一个默认的复制构造函数,其作用只是简单地复制中每个数据成员。 三、在什么情况被调用 普通构造函数在建立对象时被调用。 复制构造函数在用已有对象复制一个新对象时被调用,在以下三种情况下需要克隆对象: 1.新建一个对象,并用另一个同对象对它初始化 上面 用对象p1复制出对象p2 也可以用下面形式,二者等价: test p2=p1; 2.函数的参数为的对象时。 在调用函数时需要将实参对象完整地传递给形参,也就

wangwen18的博客 4956

C++ 5_与对象 拷贝构造函数

C++ 5_与对象 拷贝构造函数 题1 . 在下面的程序中,完善构造函数的编写,理解拷贝构造函数的作用和调用时机。要求回答: (1) 程序没有显式调用student1.upeerName(),为什么输出结果是全大写的”SUN WUKONG”? student1.name与student2.name共用一块存储空间,在调用student2.upeerName()后,student1.name已修改为大写 (2) 程序出错的原因是? student1.name与student2.name共用一块存储

人生当苦无妨 470

C++复制构造函数的实现

复制构造函数是一种特殊的构造函数,有一般构造函数的特性。它的功能是用一个已知的对象来初始化一个被创建的同对象。复制构造函数的参数传递方式必须按引用来进行传递,请看实例: #include <iostream> #include <cstring> using namespace std ; class Student { ...

weixin_34406061的博客 200

自动安装网络打印机脚本

自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本自动安装网络打印机脚本

上一篇: 关于vs2017,无法将const char *转换成char *
下一篇: Ubutu下载镜像
jackie_monkey
博客等级 码龄8年 0粉丝 4原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值