C++(二十七) — 深拷贝、浅拷贝、复制构造函数举例
1、复制构造函数、及new空间申请
复制构造函数,也是构造函数。只在初始化时调用,如果定义对象后赋值,比如,t1=t2,则只是运算符重载,没有调用构造函数。
注意:
(1)复制构造函数是函数的形参是类的对象的引用的构造函数;
(2)用一个已经存在的对象,初始化一个新的同类对象;
(3)系统会自动生成一个默认复制构造函数,将成员一一复制;
(4)类的数据成员包含指针变量,构造函数用 new 为其申请空间,必须在复制构造函数中为新对象申请新的堆空间;
#include <iostream>;
#include<string>
using namespace std; class student
{
public:
student(int,char*, int, float);
student(student&);
~student();
void printstu();
private:
int id, age;
char* name;
float score;
};
// 构造函数
student::student(int i, char *c, int a, float s)
{
cout << "Constructing...." << endl;
id = i; age = a;
score = s;
name = new char[strlen(c) + ];
if (name != )
strcpy_s(name, strlen(c) + , c);
}
// 复制构造函数
student::student(student& s)
{
cout << "Copy Constructing...." << endl;
id = s.id; age = s.age;
score = s.score;
name = new char[strlen(s.name) + ];
if (name != )
strcpy_s(name, strlen(s.name) + , s.name);
}
// 析构函数
student::~student()
{
cout << "Destructing..." << endl;
delete []name; // 释放申请的内存空间
name = ;
}
void student::printstu()
{
cout << "学号:" << id << " 姓名:" << name << endl;
cout << "年龄:" << age << " 成绩:" << score << endl;
} void main()
{
student s1(, "wang", , );
s1.printstu();
student s2(s1);// 调用复制构造函数 system("pause");
return;
}
2、浅拷贝、深拷贝
指对于类或结构体这类复合类型的变量。当类的成员变量中含有指针或引用时,在赋值或初始化过程中,若只修改指针指向,没有开辟新的空间,则是浅拷贝;(因为所指内容空间只有一份,若其中一个变量销毁时,空间释放,则另一个变量就出现指针悬挂问题)。
深拷贝:开辟另一个内存空间(在堆内存中),将内容复制过去。这样就存在两个内存空间,保存相同内容。
C++中默认的等号操作符也是浅拷贝,只是把指针的内存地址拷贝了,但没有开辟对应的内存空间。
C++(二十七) — 深拷贝、浅拷贝、复制构造函数举例的更多相关文章
- C# 浅拷贝与深拷贝(复制)
在有些时候,我们需要从数据库读取数据填充对象或从硬盘读取文件填充对象,但是这样做相对耗时.这时候我们就想到了对象的拷贝.本文即以实例形式解析了C#浅拷贝和深拷贝的用法. C#中有两种类型变量,一种 是 ...
- Java中的深拷贝(深复制)和浅拷贝(浅复制)
深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...
- C++(二十六) — 构造函数、析构函数、对象数组、复制构造函数
1.构造函数 (1)每个类都要定义它自己的构造函数和析构函数,是类的成员函数. 特点:名称与类名相同:没有返回值:一定是共有函数,可以直接访问类内所有成员函数:可以带默认形参,可以重载: class ...
- C++ 类 复制构造函数 The Copy Constructor
一.复制构造函数的定义 复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性.复制构造函数创建一个新的对象,作为另一个对象的拷贝.复制构造函数只含有一个形参,而且其形参为本类对象的引用.复制构 ...
- C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用
一. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回 ...
- 剑指offer:赋值运算符函数和复制构造函数
赋值运算符函数 对于定义一个赋值运算符函数时,需要注意一下几点: (1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值 (2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函 ...
- 编译器角度看C++复制构造函数
[C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...
- C++中复制构造函数与重载赋值操作符总结
前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...
- C++中复制构造函数与重载赋值操作符
我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: class CTe ...
随机推荐
- Java应用程序中System.out.println输出中文乱码
其实,解决办法比较简单,即:编译时指定编码为UTF-8,如: javac -encoding utf- HelloJava.java 这样,再运行时就不会出现乱码. 比较详细的内容可以参考:http: ...
- flask内置session原理
内置session原理 请求到来 当请求进来之后,先执行Flask对象的 __call__ 方法 def wsgi_app(self, environ, start_response): # 获取请求 ...
- Windows server 2003 伪静态配置方法
Windows server 2003 伪静态配置方法 先我们下载Rewrite伪静态组件到服务器,然后解压到D:\Rewrite下,解压后如下图: 提示:ReWrite组件所在目录要有网站所有者 ...
- listview与adapter用法
Android listview与adapter用法 listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用 ...
- iis 反向代理 组件 Application Request Route
安装后要重启服务器. 不然 IIS 不会生效.
- js 空数组 空对象判断
js 空数组是true还是false 1 2 var arr = new Array(); // 或 var arr = []; 我们知道,初始化后,即使数组arr中没有元素,也是一个object ...
- Tomcat之并发优化
1.位置: (1)/opt/tomcat7/conf下的server.xml文件中<Connector>节点的配置优化,记得先备份. (2)出厂默认(在server.x ...
- vi重要操作指令
[Ctrl] + [f] 萤幕『向下』移动一页,相当于[Page Down]按键( 常用 ) [Ctrl] + [b] 萤幕『向上』移动一页,相当于[Page Up]按键( 常用 ) 0 或功能键[H ...
- 【Thinking in Java, 4e】控制流程执行
p46~p75: [迭代] 1.Java不允许将数字作为布尔值用. 1.有点意思的小程序WhileTest. public class WhileTest { static boolean condi ...
- Web安全学习笔记之Openvas配置,使用,报告
OpenVAS(开放式漏洞评估系统)是一个客户端/服务器架构,它常用来评估目标主机上的漏洞.OpenVAS是Nessus项目的一个分支,它提供的产品是完全地免费.OpenVAS默认安装在标准的Kali ...