精华内容
下载资源
问答
  • 基础知识点介绍:复制构造函数 1、复制构造函数用于将一个对象复制到新创建的对象中。复制构造函数原型: Class_name(const Class_name& ); // 接受一个类对象的常量引用。 2、何时调用复制构造函数: 新建一个...

    基础知识点介绍:复制构造函数

    1、复制构造函数用于将一个对象复制到新创建的对象中。复制构造函数原型:

    Class_name(const Class_name& ); // 接受一个类对象的常量引用。
    

    2、何时调用复制构造函数:
    新建一个对象并初始化为现有对象时调用,例如:

    ClassA b(a);
    ClassA c = a;
    ClassA d = ClassA(a);
    ClassA * e = new ClassA(a);
    

    注:1、中间两种可能直接利用复制构造函数创建c和d,也可能先创建临时对象然后将其中内容赋值给c和d。
    2、函数按值传递和返回对象,都将调用。因此建议传递引用,节省时间与空间

    3、默认复制构造函数功能
    1、逐个复制非静态成员到新对象中,复制的是成员的值 (浅复制)

    存在的问题:

    1、当存在static静态成员随构造函数调用增加时(计数器功能),默认复制构造函数不能实现。
    在这里插入图片描述
    2、当类中存在new初始化的指针(类对象申请了动态内存),默认构造函数只复制指针,不开辟新空间。导致两个指针指向同一块动态内存(浅复制),析构时会造成二次释放。
    在这里插入图片描述

    解决方法:

    自己定义复制构造函数。
    1、在复制构造函数中改变static变量的值。
    2、在复制构造函数中对于成员变量为数值的可以复制;对于new的指针,需要开辟独立的动态内存,进行深度复制,避免类析构时二次释放的不确定性。

    总结

    1、类中使用动态内存(new),需要自定义复制构造函数。
    2、当不需要复制时,以防错误使用,将复制构造函数设置为私有,则调用时编译出错提醒。

    参考资料
    C++ Primer Plus: 章节:12.1.2与12.1.3

    展开全文
  • 复制构造函数和合成复制构造函数 复制构造函数 复制构造函数又称为拷贝构造函数,它是一种特殊的构造函数。它的作用就是一个已经生成的对象来初始化另一个另一个同类的对象 变量的初始化: int a=10;int b=a; ...

    复制构造函数和合成复制构造函数

    1. 复制构造函数
      复制构造函数又称为拷贝构造函数,它是一种特殊的构造函数。它的作用就是用一个已经生成的对象来初始化另一个另一个同类的对象
      变量的初始化:
      int a=10;int b=a;
      对象的初始化:
      point pt1(10,20); point pt2 = pt1;

    复制构造函数定义的一般形式为:

    类名(const 类名&obj) {
    	函数体
    }
    

    例如:

    class Point { //Point类
    	public:
    		Point() : x(0),y(0) { } //默认构造函数
    		Point(const Point& r) : (r.x),y(r.y) { } //复制构造函数
    		Point(int a,int b) : x(a),y(b) { } //带参数构造函数
    	private:
    		int ,x,y;
    };
    

    复制构造函数有且只有一个本类类型对象的引用形参,**通常使用const限定。**因为复制构造函数只是复制对象,没有必要改变传递来的对象的值

    复制构造函数的功能是利用一个已知的对象来初始化一个被创建的同类的对象

    与复制构造函数对应的对象定义形式为:

    类名 对象名1(类对象),对象名2(类对象2),....;
    

    对象赋值和对象复制的区别:

    对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值

    对象的复制是从无到有地建立一个新对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)

    1. 合成复制构造函数

    每个类必须有一个复制构造函数。如果类没有定义复制构造函数,编译器就会自动合成一个,称为合成复制构造函数(synthesized copy constructor)

    与合成默认构造函数不同,即使定义了其他构造函数,编译器,也会合成复制构造函数

    合成复制构造函数的操作是:执行逐个成员初始化,将新对象初始化为原对象的副本

    所谓”逐个成员",指的是编译器将现对象的每个非静态数据成员,依次复制到正创建的对象中。每个成员的类型决定了复制该成员的含义:
    (1)内置类型成员直接复制其值
    (2)类类型成员使用该类的复制构造函数进行复制
    (3)如果一个类具有数组成员,则合成复制构造函数将复制数组,即复制数组的每一个元素到新对象中

    逐个成员初始化可以这样理解:将合成复制构造函数看作是每一个数据成员在构造函数初始化列表中进行初始化的构造函数

    以下3种情况会使用复制构造函数

    1. 用一个对象显式或隐式初始另一个对象
      C++支持两种初始化形式:复制初始化和直接初始化。复制初始化使用等号(=),而直接初始化将初始化式放在圆括号中
      复制初始化和直接初始化是有区别的:直接初始化会调用与实参匹配的构造函数;而复制初始化总是调用复制构造函数
    Point pt1(10,20);
    Point pt2=pt1; //复制初始化
    Point pt3(pt1); //直接初始化
    
    1. 函数参数按值传递对象时或函数返回对象时
      当函数形参为对象类型,而非指针和引用类型时,函数调用按值传递对象,即编译器调用复制函数产生一个实参对象副本传递到函数中
      类似地,以对象类型作为返回值时,编译器调用复制构造函数产生一个return语句中的值的副本返回到调用函数

    2. 根据元素初始化式列表初始化数组元素时
      如果没有为类类型数组提供元素初始化式,则将用默认构造函数初 始化每个元素。然而,如果使用常规的大括号的数组初值列表形式 来初始化数组时,则使用复制初始化来初始化每个元素

    总的来说,正是有了复制构造函数,函数才可以传递对象和返回对象,对象数组才能用初值列表的形式初始化

    深复制与浅复制

    如果一个拥有资源(如用new得到的动态内存)的类对象发生复制的时候,若对象数据与资源内容一起复制,称为深复制,如图所示:
    在这里插入图片描述
    若复制对象但未复制资源内容称为浅复制,如图所示:
    在这里插入图片描述
    深复制,浅复制举例:

    #include<iostream>
    #include<string>
    using namespace std;
    
    class CA {
    	public:
    		CA(int b,char *cstr) { //构造函数
    			a=b;
    			str=new char[b];
    			strcpy(str,cstr);
    		}
    		CA(const CA &C) { //复制构造函数
    			a=C.a;
    			str=new char[a]; //深复制,浅复制则写成str=C.str
    		}
    		if(str!=0)
    			strcpy(str,C.str);
    		void show() {
    			cout<<str<<endl;
    		~CA() { //析构函数
    			delete str;
    		}
    	private:
    		int a;char *str;
    };
    
    int main()
    {
    	CA a(10,"hello");
    	CA b=a;
    	b.show();
    	return 0;
    }
    		
    
    展开全文
  • 上面不执行复制构造函数

    1

      

     上面不执行复制构造函数,17行将10000赋值给a:首先是进行类型转换转化为类(等价18行),然后调用构造函数创建一个临时对象,

    并将该临时对象赋给a.

       2.


      对func函数:

                      接收的实参是主函数中a的副本,因此调用复制构造函数并将a的副本赋给func的形参one.

                      返回的是one的副本,因此又要调用复制构造函数将one的副本返回给主函数

    这是复制构造函数的两种使用情况:按值(对象)接收和按值(对象)返回

    3.

      23行调用复制构造函数来构造对象b

    这是复制构造函数的第三种情况.

     复制构造函数也可以构造对象.

    4.谭浩强C++:

         对象的赋值或者复制只针对其中的数据成员赋值,不对成员函数赋值,显然如果类的数据成员中包含动态分配的数据或指向动态分配的指针的话

    当析构完原对象时,被赋值或者复制的对象中对应的数据成员会出现找不到原堆中空间的问题.

        对象的赋值是在对一个已经存在的对象赋值,因此必须先定义被赋值的对象,然后才能进行赋值.

        对象的复制则是从无到有地建立一个新对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值),也就是说在创建对象的同时

    并用一个对象对该对象初始化.

    5.普通构造函数与复制构造函数

         被调用情况:普通构造函数在程序中建立对象时被调用

                               复制构造函数在用已有对象对复制一个新对象时被调用



       

    
    展开全文
  • 1)已定义所有使用父类对象创建子类对象的构造函数 2 )定义了base,d2的复制构造函数 3)未定义d1复制构造函数的情况下 使用base类创建d2类,会先构建d1类,再d1类构建d2类,逐级提升构造。 这是因为编译器...

    Tips:

    如存在d2->d1->base的类继承关系

    1)已定义所有使用父类对象创建子类对象的构造函数
    2 )定义了base,d2的复制构造函数
    3)未定义d1复制构造函数的情况下

    1. 使用base类创建d2类,会先构建d1类,再用d1类构建d2类,逐级提升构造。
      这是因为编译器发现了使用d1构建d2的途径以及base构建d1的途径,是这2个“提升”构造函数的存在,使得这样的构建可行。

    假如不定义使用d1创建d2的构造函数,则使用base类和d1类都无法创建d2,编译阶段报错!

    1. 使用d2类构建d2类,会使用d2的复制构造函数,d2复制构造函数调用d1复制构造函数(未显式定义,但仍调用),d1复制构造函数虽然未显式定义,但有默认复制构造函数
      且更重要的是,d1的默认复制构造函数还默认调用基类base的显式构造函数,也就是说,如果只有基类有需要定义复制的指针变量,只需要在基类定义即可,其余变量就可以直接调用默认复制构造函数,也能保证正确性。
    展开全文
  • 复制构造函数

    千次阅读 多人点赞 2018-09-03 11:11:35
    复制构造函数是一种特殊构造函数,在生成一个实例时,一般会同时生成一个默认的复制构造函数复制构造函数完成一些基于同一类的其他对象的构建及初始化工作。 特点 复制构造函数名与类名同名,因为它是一种...
  • C++类三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。  复制...
  • 1.复制构造函数 复制构造函数又称为拷贝构造函数, 它是一种特殊的构造函数。 它的作用就是一个已经生成的对象来初始化另一个同类的对象。 变量的初始化: int a=10; int b=a; 对象的初始化: Point pt1(10,20); ...
  • 构造函数用来初始化对象的,复制构造函数是把一个已知的对象复制给新的对象,(2者都是对象)。 浅复制构造函数只复制指针(换句话说就是2个对象的地址一样), 深复制构造函数定义内new了一个新地址,因此2个对象...
  • //***** 浅层复制构造函数 ***** class Person { public: Person(){}; Person(Person &one) // 自定义浅层复制构造函数,就是复制一个对象,说到底,就是复制传进来的对象的所有成员变量,实际上,系统的默认浅层...
  • 类的赋值构造函数和复制构造函数

    千次阅读 2016-10-31 22:41:49
    整体的说一下,复制构造函数和赋值构造函数的相同点是: 赋值运算符和复制构造函数都是已存在的B对象来创建另一个对象A; 最大的不同在于:赋值构造函数处理两个已有对象,即赋值前B应该是存在的;复制构造函数是...
  • 对于我来说,在写代码的时候能得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么,其实复制构造函数能解决一些我们常常会忽略的问题。  为了说明复制构造函数作用,我先说说我们在编程时会...
  • C++ 复制构造函数

    2018-03-23 10:39:18
    2)当定义一个新对象,并用一个同类型的对象初始化时,将调用复制构造函数3)当该类型的对象传递给函数或从函数返回,将隐式使用复制构造函数。2.复制构造函数使用的时机1)根据另一个同类型的对象显式或隐式初始化另外...
  • C++复制构造函数

    2016-03-27 19:04:19
    对于我来说,在写代码的时候能得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么,其实复制构造函数能解决一些我们常常会忽略的问题。  为了说明复制构造函数作用,我先说说我们在编程时会遇到...
  • 构造函数与复制构造函数复制构造函数中的引用符,时有时不有,初学时不易理解,做点小归纳: 预备知识: 当类中没有定义任何构造函数(包括复制构造函数)时,编译器将生成默认构造函数 当类中没有定义复制构造...
  • 复制构造函数使用

    2018-09-27 16:50:57
    复制构造函数使用 复制构造函数可以一个对象去初始化另一个对象。在创建类时如果没有编写构造函数,C++会自动生成一个,原对象相应数据成员的值去初始化新对象的每个数据成员。如果数据成员是对象,初始化意味...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 290,579
精华内容 116,231
关键字:

复制构造函数怎么用