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++(二十七) — 深拷贝、浅拷贝、复制构造函数举例的更多相关文章

  1. C# 浅拷贝与深拷贝(复制)

    在有些时候,我们需要从数据库读取数据填充对象或从硬盘读取文件填充对象,但是这样做相对耗时.这时候我们就想到了对象的拷贝.本文即以实例形式解析了C#浅拷贝和深拷贝的用法. C#中有两种类型变量,一种 是 ...

  2. Java中的深拷贝(深复制)和浅拷贝(浅复制)

    深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...

  3. C++(二十六) — 构造函数、析构函数、对象数组、复制构造函数

    1.构造函数 (1)每个类都要定义它自己的构造函数和析构函数,是类的成员函数. 特点:名称与类名相同:没有返回值:一定是共有函数,可以直接访问类内所有成员函数:可以带默认形参,可以重载: class ...

  4. C++ 类 复制构造函数 The Copy Constructor

    一.复制构造函数的定义 复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性.复制构造函数创建一个新的对象,作为另一个对象的拷贝.复制构造函数只含有一个形参,而且其形参为本类对象的引用.复制构 ...

  5. C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用

    一. 构造函数是干什么的   class Counter   {   public:            // 类Counter的构造函数            // 特点:以类名作为函数名,无返回 ...

  6. 剑指offer:赋值运算符函数和复制构造函数

    赋值运算符函数 对于定义一个赋值运算符函数时,需要注意一下几点: (1)函数的返回类型必须是一个引用,因为只有返回引用,才可以连续赋值 (2)传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函 ...

  7. 编译器角度看C++复制构造函数

    [C++对象模型]复制构造函数的建构操作 关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义.调用时机.也对编译器合成的复制构造函数行为 ...

  8. C++中复制构造函数与重载赋值操作符总结

    前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...

  9. C++中复制构造函数与重载赋值操作符

    我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类:   class CTe ...

随机推荐

  1. nginx映射文件服务器文件夹

    nginx映射文件服务器文件夹 普通用户A安装的nginx,yum源搭建文件服务器,新建普通用户B,其主目录是文件服务器需要访问的目录 普通用户A启动nginx无法访问B用户的文件服务器目录,提示40 ...

  2. 谷歌浏览器不能打开本地HTML文件

    打开浏览器右上角菜单——>更多工具——>扩展程序——>将Axure RP Extension For Chrome 0.62.crx文件拖入——>成功后,勾选相关选项 文件的下 ...

  3. Redis操作手册

    一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...

  4. Django restful Framework 之序列化与反序列化

    1. 首先在已建好的工程目录下新建app命名为snippets,并将snippets app以及rest_framework app加到工程目录的 INSTALLED_APPS 中去,具体如下: IN ...

  5. webpack打包静态资源和动态资源

    1.对于静态引用的资源: <img src = "static/modelname/imgname.png"> // 修改为下面的写法 <img src = &q ...

  6. SSIS 2012 Error: An Integration Services class cannot be found

    升级SSIS到SQL Server 2012,服务器只安装了SSIS一个功能,应用程序执行dtsx包时报错如下: An Integration Services class cannot be fou ...

  7. 对于近阶段公司代码 review 小结

    来新公司,给公司的SDK review了一下.发现了不少小问题,在此总结一下. (我下面说明问题可能是很简单,但是搞清楚某些问题还是花了些时间的,大家引以为戒吧) 先谈谈处理的问题: 1.某天QA说有 ...

  8. iOS开发之JSONKit

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  9. Android利用方向传感器获得手机的相对角度实例说明

    http://www.jb51.net/article/37710.htm 1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较 ...

  10. 【c++ primer, 5e】特殊用途语言特性

    [默认实参] 1.注意点:函数的默认实参可以在函数的声明中添加,但是后续声明只能添加默认参数而不能改变先前声明的默认参数.(函数的声明通常是定义在头文件上的,多次声明同一个函数是合法的) 2.默认实参 ...