精华内容
下载资源
问答
  • 如果一个函数是通过值传递(pass by value)的话,那么它真正传递的其实是实参的副本,该副本产生必定会调用复制构造函数。那么,试想一下,如果我们的复制构造函数是通过值传递的话,它就会调用它本身来产生一个副本...

    如果一个函数是通过值传递(pass by value)的话,那么它真正传递的其实是实参的副本,该副本产生必定会调用复制构造函数。那么,试想一下,如果我们的复制构造函数是通过值传递的话,它就会调用它本身来产生一个副本,就这样会无限递归下去,而如果传递引用,就不会产生副本,也不会调用复制构造函数,问题得以解决。

    展开全文
  • 复制构造函数

    千次阅读 多人点赞 2018-09-03 11:11:35
    复制构造函数是一种特殊构造函数,在生成一个实例时,一般会同时生成一个默认的复制构造函数复制构造函数完成一些基于同一类的其他对象的构建及初始化工作。 特点 复制构造函数名与类名同名,因为它是一种...

    简述

    • 复制构造函数是一种特殊构造函数,在生成一个实例时,一般会同时生成一个默认的复制构造函数,复制构造函数完成一些基于同一类的其他对象的构建及初始化工作。

    特点

    • 复制构造函数名与类名同名,因为它是一种构造函数,并且函数不指定返回类型。

    • 该函数只有一个参数,并且是某个对象的引用

    • 每个类都必须有一个复制构造函数。如果程序员没有显式地定义一个复制构造函数,C++编译器会自动生成一个缺省的复制构造函数。

    • 复制构造函数需要考虑深拷贝和浅拷贝的问题,默认构造函数只进行浅拷贝,当我们的类私有数据成员中含有指着类型时,需要进行深拷贝,即显式地定义复制构造函数

    #include<iostream>
    
    using namespace std;
    
    class A {
    public:
        A(int val) :a(val) {
            p = new int(a);
        }
        A(const A& it) {
            a = it.a;
            delete p;
            p = new int(a);
            cout << it.p << endl;  //0051C0B8
            cout << p << endl;     //0051C0E8
        }
        int get() {
            return *p;
        }
    private:
        int a;
        int *p;
    };
    
    int main(int argc, char* argv[]) {
        A A1(10);
        A A2(A1);
        cout << A2.get() << endl;  //10
        getchar();
        return 0;
    }

    复制构造函数和赋值运算符的区别

    • 复制构造函数生成新的类对象,而赋值运算符不能。

    • 当类中有指针类型的成员变量时,一定要重写复制构造函数和赋值运算符,不能使用默认的。

    • 当进行一个类的实例初始化时,也就是构造时,调用的是构造函数,但如果用其他实例来初始化,则调用的是复制构造函数,非初始化时这个实例进行赋值调用的是赋值运算符。(重要!!!)

    #include<iostream>
    
    using namespace std;
    
    class A {
    public:
        A(int val) :a(val) {
            p = new int(a);
        }
        A(const A& it) {
            cout << "复制构造函数" << endl;
            a = it.a;
            delete p;
            p = new int(a);
            cout << it.p << endl;  
            cout << p << endl;     
        }
        A& operator=(const A& it) {
            cout << "赋值运算符" << endl;
            a = it.a;
            delete p;
            p = new int(a);
            cout << it.p << endl;  
            cout << p << endl;    
            return *this;
        }
        int get() {
            return *p;
        }
    private:
        int a;
        int *p;
    };
    
    int main(int argc, char* argv[]) {
        A A1(10);
        A A3(30);
        A A2 = A1;
        A2 = A3;
        cout << A2.get() << endl; 
        getchar();
        return 0;
    }

    这里写图片描述

    扩展:空类默认产生哪些成员函数

    • 默认构造函数

    • 复制构造函数

    • 析构函数

    • 赋值运算符重载函数

    • 取址运算符重载函数

    • const取址运算符重载函数

    class A {
    public:
        A();
        ~A(){}
        A(const A&);
        A& operator=(const A&);
        A* operator&();
        const A* operator&() const;
    };
    展开全文
  • 当新对象被创建的时候,会调用构造函数。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,java... java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不是自己写的构造函数的情况下,jav...

           当新对象被创建的时候,会调用构造函数。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,java编译器会为这个类创建一个默认的构造函数。

      java中构造函数的重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数都必须有他唯一的参数列表。

      java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不是自己写的构造函数的情况下,java不会创建默认的复制构造函数。

    转载于:https://www.cnblogs.com/fanvfan/p/7563372.html

    展开全文
  • 什么是复制构造函数复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性 ,它的形参是本类的对象的引用,比如(类名 对象名)。它的作用是使用一个已经存在的对象(此对象由复制构造函数参数决定...

    什么是复制构造函数:

            复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性 ,它的形参是本类的对象的引用,比如(类名   对象名)。它的作用是使用一个已经存在的对象(此对象由复制构造函数的参数决定),去初始化同类的一个新对象。那么复制构造函数一般在什么情况下被调用呢,有三种情况:

    (1)当用类的一个对象去初始化该类的另一个对象的时候

    :   int  main()

              {

                        Point  a(1,2);              // 调用类的构造函数(Point类)

                        Point  b(a);                 // 用已存在的对象a初始化新对象b,复制构造函数被调用

                        Point c=a;                  // 用已存在的对象a初始化新对象c,复制构造函数被调用

                        return 0;

               }

    (2)如果函数的形参是类的对象,调用此函数的时候,进行形参和实参相结合时,复制构造函数被调用

    例:    void f(Point  p)

             {

                   cout<<p.getX()<<endl;

             }

             int main()

             {

                    Point  a(1,2);

                    f(a);                                         // 函数的形参为类的对象,当调用函数时,实参与形参结合,复制构造函数被调用

                    return 0;

              }

                    注意:只有把对象用值传递的时候,才会调用复制构造函数,如果传递引用,则不会调用复制构造函数。

    (3)如果函数的返回值是类的一个对象,函数执行完成返回调用者时,复制构造函数被调用

    :         Point  g()

                 {

                           Point  a(1,2);

                           return a;                            // 函数的返回值是类的对象a,返回函数值时,复制构造函数被调用

                 }

                int main()

                {

                           Point  b;

                           b=g();

                           return  0;

                 }

                  注意:这种情况下,表面上函数g将a返回给了主函数,但是a是g()的局部对象,离开建立他的函数g以后a就不存在了,不可能在返回给主函数后继续生存,所以在处理这种情况的时候编译器系统会在主函数中创建一个无名的临时对象,该临时对象的生存期只在函数调用所处的表达式中,也就是表达式 b=g() 中。执行语句“ return a ”时,实际上是调用复制构造将a的值复制到临时对象中,所以在此调用了复制构造函数。函数g运行结束时对象a消失,但临时对象会存在于表达式“ b=g()”中。计算完这个表达式后,临时对象的任务也就完成了,改临时对象就会自动消失。

            以上便是复制构造函数经常被调用的三种情况。下面我写一下类Point,便于大家参考。

    class  Point

    {

       public:

                Point (int xx=0, int yy=0)                 // 构造函数,带有形参

                {                 

                              x=xx;   y=yy;           

                }

                Point (Point &p);                           // 复制构造函数

                int getX() {   return x;   }

                ..........

       private:

                 int x , y;

    };

    Point::Point(Point  &p)                 // 复制构造函数实现

                 x=p.x;

                 y=p.y;

    }

    展开全文
  • 什么是复制构造函数

    千次阅读 2016-03-14 13:58:06
    复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。它存在唯一一个参数是不可变的。这个函数经常在函数调用期间于用户定义类型的值传递及返回。...
  • 类的赋值构造函数和复制构造函数

    千次阅读 2016-10-31 22:41:49
    C++的初学者经常会对复制构造函数一知半解,我曾经对复制构造函数和赋值函数就很是迷茫。闲来无事,整理一下,一个对象的赋值构造函数和赋值构造函数。整体的说一下,复制构造函数和赋值构造函数的相同点是: 赋值...
  • C++ 赋值构造函数 复制构造函数

    千次阅读 2018-08-25 15:29:11
    编译器提供一个不接受任何参数,也不执行任何操作的构造函数,称之为默认构造函数 这是因为创造对象的时候总会调用默认构造函数 Klunk::Klunk() {} //定义 Klunk lunk; //声明 使用默认构造函数 如果定义了构造...
  • C++复制构造函数

    千次阅读 2018-05-09 23:17:09
    C ++里的类有默认构造函数,自己定义的构造函数,允许通过类构造函数实现类的类型的隐式转换或者显示转换(构造函数前带explicit关键字),比如如下代码Jungle定义了一个类A,定义了两个构造函数: using namespace...
  • 复制构造函数 是一种特殊的构造函数,在生成一个实例的时候,一般会同时生成一个默认的复制构造函数复制构造函数完成一些基于同一类的其他对象的构建及初始化工作。 拷贝构造函数的特点 该函数名与类名同名,因为...
  • 般来讲出现这个错误时,是因为复制构造函数参数没有加const,加上就好了
  • 复制构造函数与拷贝构造函数

    千次阅读 2014-09-16 11:39:03
    也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生。对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制...
  • C++中类的构造函数与复制构造函数

    千次阅读 2017-04-27 10:52:42
    在网络上有朋友提到“主要原因在于编译器的优化,当复制构造函数是public时,编译器就会根据这个特性来对代码进行优化。当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,此时就会通过...
  • 一般来讲出现这个错误时,是因为复制构造函数参数没有加const,加上就好了
  • 构造函数的参数列表初始化 是会调用复制构造函数  关于函数传递  1.如果类型是void setC(C &c)  则实参形参相传不会调用任何的构造函数 2.如果类型是void setC(C c)  则实参形参相传会调用对象的复制...
  • 什么是复制构造函数复制构造函数是一个成员函数,它使用同一个类的另一个对象初始化一个对象。函数原型如下: ClassName(const ClassName &old_obj); 下面是一个复制构造函数的简单示例: #include <...
  • #include &...class CExample{public: CExample(int x) :m_nTest(x) //带参数构造函数 { cout&lt;&lt; "constructor with argument."&lt;&lt;endl; } CExample(const C...
  • 浅析复制构造函数

    2013-06-05 18:01:08
    其作用是使用一个已经存在的对象(由复制构造函数参数指定),去初始化同类的一个新对象。如果程序员没有没有定义类的复制构造函数,系统会在必要时自动生成一个隐含的复制构造函数。这个隐含的复制构造函数的功能...
  • 构造函数和复制构造函数 转载自:http://hi.baidu.com/myzjdx/blog/item/db36a6dd58faf4df8d1029b3.html  构造函数、复制构造函数和赋值操作符在生成对象和对象之间的复制时用到。如果类中没有显式定义这三种...
  • 假设Person是一个类,复制构造函数的调用会在以下几种情况下发生: 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在定义...
  • C++拷贝构造函数(复制构造函数

    千次阅读 2018-12-22 14:03:33
    复制构造函数是构造函数的一种特殊情况。因为类的对象包含各种成员变量,在发生拷贝时不能和普通对象一样来拷贝,所以我们需要使用拷贝构造函数来进行对象拷贝。拷贝构造函数只有一个参数参数类型是本类的引用。 ...
  • 构造函数、复制构造函数和赋值操作符在生成对象和对象之间的复制时用到。如果类中没有显式定义这三种函数,那编译器通常会为我们定义(合成)。如果类中定义了一个带参数的构造函数,那么编译器就不会再自动合成默认...
  •  也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生。对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什么用,其实复制...
  • 【C++】派生类定义复制构造函数怎么传、传什么初始化参数给它的基类们?  若派生类定义复制构造函数,一般都要为基类的复制构造函数传递参数,但是复制构造函数的形参表里只能有一个参数,那么这个问题怎么解决呢?...
  • 构造函数成员函数的一种,名字与类名相同,可以有参数,不能有返回值(void也不行)。 一个类可以有多个构造函数。 如果定义类时没写构造函数,则编译器生成一个默认的无参构造函数,这个构造函数不做任何操作。...
  • 复制构造函数小问题

    2015-05-09 05:50:44
    如果类中成员函数的参数和返回值都是此类对象,那么复制构造函数调用两次?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 226,492
精华内容 90,596
关键字:

复制构造函数的参数是什么