C++拷贝构造函数

在定义任何C++类时,拷贝空置操作都是必要部分,类需要控制拷贝、赋值和销毁对象时发生的行为。拷贝构造函数的用途:当创建了一个新对象时,可以用另一个对象的数据初始化这个新建的对象。

1、默认拷贝构造函数

  如果在程序中我们没有显示定义拷贝构造函数,则C++会为每个类隐式地提供一个缺省的拷贝构造函数,不过就算我们显示定义了拷贝构造函数,程序同样也会自己合成一个默认的构造函数。缺省的构造函数简单地将参数对象的每个数据域复制给对象中相应的副本。拷贝构造函数和赋值运算符是相似的,它们把一个对象的值赋给另一个对象,但两者不一样!使用拷贝构造函数将创建新的对象,而使用赋值运算符则不会创建新对象。比如下面的例子:

//circle.h
#ifndef _CIRCLE_H_
#define _CIRCLE_H_

class Circle{
    public:
        Circle();
        Circle(double radius);
        ~Circle();
        void setRadius(double radius);
        double getRadius();
        double getArea();
    private:
        double radius;
};

#endif //circle.h
#include "circle.h"
#include <iostream>

Circle::Circle(){
    radius = ;
}

Circle::Circle(double radius){
    this->radius = radius;
}

void Circle::setRadius(double radius){
    this->radius = radius;
}

double Circle::getRadius(){
    return radius;
}

double Circle::getArea(){
    return 3.14159 * radius * radius;
}

Circle::~Circle(){
}

测试函数main:

#include <iostream>
#include "circle.h"
using namespace std;

int main(){
    Circle c1();
    Circle c2(c1);    //这里没有显示定义拷贝构造函数,编译器就隐式调用了一个 

    cout << "The c1 radius is " << c1.getRadius()
        << " and area is " << c1.getArea() << endl;

    cout << "The c2 radius is " << c2.getRadius()
        << " and area is " << c2.getArea() << endl;

    ;
}

运行结果如下(我们发现两个Circle对象c1和c2数据域都是一样的):

2、“深拷贝”和“浅拷贝”

  “浅拷贝”指的是拷贝指针的地址,不拷贝该指针指向的内存内容;“深拷贝”指的是拷贝指针指向的内存内容,不拷贝指针本身。程序隐式生成的拷贝构造函数和赋值运算符进行对象复制采用的是一种所谓的“浅拷贝”。

C++拷贝构造函数专题的更多相关文章

  1. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  2. C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别

    class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...

  3. C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?

    之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导 ...

  4. C++拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数: X::X(const X&); X::X(X& ...

  5. PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天

    PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1  关于转换构造函数  ClassDemo demo = 1;  调用转换构造函数 2  关于拷贝赋值函数  demo =2; 首 ...

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

    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #i ...

  7. C++ 拷贝构造函数 和 六大函数

    1.  C++什么时候会调用 拷贝构造函数? a.一个对象作为函数参数,以值传递的方式传入函数体: b.一个对象作为函数返回值,以值传递的方式从函数返回:(实际使用时,会被编译器优化掉) c.一个对象 ...

  8. 一个CString的实现 拷贝构造函数的应用

    class CString { public: CString (char* s); CString(); ~CString(); private: char *str; int len; stati ...

  9. 【转】C++的拷贝构造函数深度解读,值得一看

    建议看原帖  地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...

随机推荐

  1. 利用js实现禁用浏览器后退

    原博主链接为:http://blog.csdn.net/zc474235918/article/details/53138553 现在很多的内部系统,一些界面,都是用户手动点击退出按钮的.但是为了避免 ...

  2. JAVA_多线程_单例模式

    这篇是入职之后的第二篇了,上一篇我简单介绍了一下LOCK里面的类的方法,感兴趣的话可以去了解一下,以后坚持每周至少会更新一篇关于多线程方面的文章,希望博友们可以一起加油成长. 这篇主要的内容是单例模式 ...

  3. 微信H5支付:网络环境未能通过安全验证,请稍后再试。解决办法(PHP版)

    前(tu)言(cao) (这段前言纯属吐槽,着急解决问题的小伙伴,赶紧看正文吧) 最近做了支付宝和微信支付,先做的是PC端网站的支付,就是出个二维码,然后手机扫描支付,当然支付宝在扫码页面支持登录支付 ...

  4. django下进行项目的部署

    -------------------Django下进行对应的服务器配置1.服务器购买 本人在阿里云购买了一个服务器,操作系统为windows server2008/Linux(ubuntu) 2.服 ...

  5. 2017最新的Python教程分享

    Python在数据科学盛行的今天,其易于阅读和编写的特点,越来越受编程者追捧.在IEEE发布的2017年编程语言排行榜中,Python也高居首位.如果你有学Python的计划,快来看看小编分享的Pyt ...

  6. java初步—参数的值传递

    校招季,本人匆匆忙忙地参加各种宣讲会,几次笔试下来都遇到同一个题目,而且全都错在同一想法上,方知自己的基础实在不太牢固,因此特别写在博客上提醒自己要脚踏实地地学习!不多说了,题目如下: public ...

  7. 线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行 ...

  8. PHP常量定义define与const

    一.const PHP5.3以前,const只能在类内部声明变量,5.3+允许在外部声明变量,但还不能使用常量计算! const ONE = 1; const WORD = 'hello world' ...

  9. chrome开发工具指南(四)

    Sources 面板中 代码段是您可以从任何页面运行的小脚本(类似于小书签). 使用"Evaluate in Console"功能可以在控制台中运行部分代码段. 请注意,Sourc ...

  10. vue-cli搭建多页面项目如何配置

    这里使用的是webpack模板. 首先安装vue-cli,执行命令 npm install vue-cli -g: 安装完成后初始化一个项目模板:vue init webpack myproject; ...