精华内容
下载资源
问答
  • 1、对象在创建时使用其他... //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对象,与函数内的局部变量具有相同的作用域需要注意的是,赋值并不会调用复制构造函数,赋值只是赋值运算符(重载)

    1.对象在创建时使用其他的对象初始化

    Person p(q); //此时复制构造函数被用来创建实例p
    Person p = q; //此时复制构造函数被用来在定义实例p时初始化p
    

    2.对象作为函数的参数进行值传递时

    f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对象,与函数内的局部变量具有相同的作用域
    

    需要注意的是,赋值并不会调用复制构造函数,赋值只是赋值运算符(重载)在起作用

    p = q; //此时没有复制构造函数的调用!
    

    简单来记的话就是,如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在,然后将另一个已存在的对象赋给它,调用的就是赋值运算符(重载)

    默认的复制构造函数和赋值运算符进行的都是”shallow copy”,只是简单地复制字段,因此如果对象中含有动态分配的内存,就需要我们自己重写复制构造函数或者重载赋值运算符来实现”deep copy”,确保数据的完整性和安全性。

    eg:

    string.h

    #include<iostream>
    #include<cstring>
    #ifndef STRING_H_
    #define STRING_H_
    class string
    {
    private:
        char *data;
    public:
        string();
        string(const char *value);
        string(const string & s);
        ~string();
        operator=(const string & s);
    };
    #endif

    string_h.cpp

    #include"string.h"
    using std::cout;
    using std::endl;
    
    string::string()
    {
        data=new char[4];
        data="c++";
       cout<<"构造函数无参:"<<data<<endl;
    
    }
    
    string::string(const char *value)
    {
        if(value)
        {
            data=new char[strlen(value)+1];
            strcpy(data,value);
        }
        else
        {
            data=new char[1];
            *data='\0';
        }
        cout<<"构造函数有参:"<<data<<endl;
    }
    
    string::string(const string & s)
    {
        data=new char[strlen(s.data)+1];
        strcpy(data,s.data);
        cout<<"拷贝构造函数:"<<data<<endl;
    }
    
    string::~string()
    {
        delete [] data;
    }
    
    string::operator =(const string & s)
    {
        data=new char[strlen(s.data)+1];
        strcpy(data,s.data);
        cout<<"重载操作符=:"<<data<<endl;
    }

    string.cpp

    #include<iostream>
    #include"string.h"
    
    int main()
    {
        string a("hello"); // 定义并构造 a ,有参构造
        string b(a); // 定义并构造b,显式调用拷贝构造函数
        string c;//无参构造 
        c=a;//调用=运算符重载
        string d=c;//隐式调用拷贝构造函数,而不是=运算符重载
        return 0;
    }

    转自:http://www.cnblogs.com/vinsonLu/archive/2012/09/28/2706723.html

    展开全文
  • 什么复制构造函数复制构造函数是一种特殊的构造函数,具有一般构造...那么复制构造函数一般在什么情况下被调用呢,有三种情况: (1)当用类的一个对象去初始化该类的另一个对象的时候 例: int main() ...

    什么是复制构造函数:

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

    (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;

    }

    展开全文
  • 在函数中自动调用复制构造函数 #include #include #include using namespace std; class A { public: A(string name):_name(name) { cout << 类名为: << _name << ,调用构造函数,构造对象地址...
  • 什么复制构造函数复制构造函数是一个成员函数,它使用同一个类的另一个对象初始化一个对象。函数原型如下: ClassName(const ClassName &old_obj); 下面是一个复制构造函数的简单示例: #include <...

    什么是复制构造函数?

    复制构造函数是一个成员函数,它使用同一个类的另一个对象初始化一个对象。函数原型如下:

    ClassName(const ClassName &old_obj);
    

    下面是一个复制构造函数的简单示例:

    #include <iostream>
    using std::cout;
    
    class Point {
    private:
        int x, y;
    public:
        Point(int x1, int y1) { x = x1, y = y1; } //带参构造函数
        //复制构造函数
        Point(const Point& p) { x = p.x, y = p.y; }
    
        int getx() { return x; }
        int gety() { return y; }
    };
    
    int main()
    {
        Point p1(10, 20);
        Point p2 = p1;
        cout << "\np2对象x和y的值分别是:\n" << p2.getx() << "  " << p2.gety();
        return 0;
    }
    

    **输出:**10,20

    复制构造函数何时调用?

    1. 当类的对象按值返回时。(也就是把对象做为返回值,那接受对象的变量也必须是一个对象,所以会调用复制构造函数)
    2. 当类的对象通过值作为参数传递(传递给函数)时。因为函数按值传递是传副本。
    3. 根据同一个类的另一个对象构造一个对象时。
    4. 编译器生成临时对象时。

    **但是,不能保证在所有这些情况都将调用复制构造函数,因为C++标准允许编译器在某些情况下优化复制,一个例子是返回值优化(有时称为RVO)。

    什么时候需要用户定义的副本构造函数?

    如果我们不定义自己的副本构造函数,则C++编译器会创建一个默认的,该类在对象之间进行成员级复制。编译器创建的复制构造函数通常可以正常工作。可当对象具有指针、文件句柄、网络连接等,才需要我们自己定义的复制构造函数。

    默认构造函数仅执行浅复制
    在这里插入图片描述

    复制构造函数 与 赋值运算符
    下面两个语句中,哪个调用复制构造函数?

    MyClass t1,t2;
    MyClass t3 = t1;  //-----> (1)
    t2 = t1;  // ------> (2)
    

    从现有对象创建新对象作为现有对象的副本时,将调用复制构造函数。
    当以初始化的对象从另一个现有对象中分配新值时,将调用分配运算符。
    所以,上面第一句调用复制构造函数,第二句调用赋值运算符。

    下面是一个完整的C++程序,此例必须使用复制构造函数

    #include <iostream>
    using namespace std;
    
    class String {
    private:
        char* s;
        int size;
    public:
        String(const char* str = NULL); //构造函数
        ~String() { delete[]s; } //析构函数
        String(const String&); //复制构造函数
        void print() { cout << s << endl; } //输出字符串
        void change(const char*); //改变功能
    };
    
    String::String(const char* str) {
        size = strlen(str);
        s = new char[size + 1];
        strcpy_s(s, size + 1, str);
    }
    
    void String::change(const char* str) {
        delete[]s;
        size = strlen(str);
        s = new char[size + 1];
        strcpy_s(s, size + 1, str);
    }
    
    String::String(const String& old_str) {
        size = old_str.size;
        s = new char[size + 1];
        strcpy_s(s, size + 1, old_str.s);
    }
    
    int main()
    {
        String str1("俺蔡文姬打野贼6...."); //对象初始化
        String str2 = str1; //对象复制,调用复制构造函数
    
        str1.print(); //输出
        str2.print(); //输出
    
        str2.change("一看战绩0—5  "); //修改类成员值
    
        str1.print();
        str2.print();
        return 0;
    }
    

    如果从上面代码中删除复制构造函数,会出现上面问题?
    无法获得预期的输出,对str2所做的修改也会反映在str1中

    可以将复制构造函数设为私有吗?
    可以把构造函数设为私有,这样此类的对象将变为不可复制。

    为什么必须将复制构造函数的参数作为引用传递?
    按值传递对象时,将调用复制构造函数。复制构造函数本身就是一个函数。因此,如果我们在复制构造函数中按值传递参数,则会对复制构造函数进行调用,以调用复制构造函数,这将成为一个无终止的调用链。所以,编译器不允许按值传递参数。

    为什么复制构造函数的参数应该为 const ?
    当我们创建自己的副本构造函数时,我们通过引用传递对象,并且通常将其作为const引用传递。传递const引用的原因之一是,以免意外修改对象。这是用const的一个很好的理由,但还有更多原因。

    展开全文
  •  那么我们定义的复制构造函数什么时候调用呢,总结起来,有如下五种情况,下面分别举例说明。  一、根据一个同类型对象显示或隐式初始化一个对象。  例如:  string str1 = 123456;//copy-initialization...
  • 假设Person是一个类,复制构造函数调用会在以下几种情况下发生: 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在定义...

    原文:Slyar Home (www.slyar.com)

    这个问题不是疑问了,查了一下国外网站,总结一下。假设Person是一个类,复制构造函数的调用会在以下几种情况下发生:

    1、对象在创建时使用其他的对象初始化

    Person p(q); //此时复制构造函数被用来创建实例p

    Person p = q; //此时复制构造函数被用来在定义实例p时初始化p

    2、对象作为函数的参数进行值传递时

    f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对象,与函数内的局部变量具有相同的作用域

    需要注意的是,赋值并不会调用复制构造函数,赋值只是赋值运算符(重载)在起作用

    p = q; //此时没有复制构造函数的调用!

    简单来记的话就是,如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在,然后将另一个已存在的对象赋给它,调用的就是赋值运算符(重载)

    默认的复制构造函数和赋值运算符进行的都是"shallow copy",只是简单地复制字段,因此如果对象中含有动态分配的内存,就需要我们自己重写复制构造函数或者重载赋值运算符来实现"deep copy",确保数据的完整性和安全性。

    展开全文
  • 1.什么是拷贝构造函数: CA(const CA& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型...
  • 复制构造函数什么时候被调用

    千次阅读 2013-07-30 12:00:02
    假设Person是一个类,复制构造函数调用会在以下几种情况下发生: 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在
  • 拷贝构造函数 都是在什么情况下调用?... 什么时候调用拷贝构造函数 ** */ #include using namespace std; //日期类 class Date{ public: int year,month,day; Date(){//无参构造 cout 日期类的构造函数" <<
  • C++ 复制构造函数被调用的三种情况

    千次阅读 2020-01-06 11:35:12
    Point类 class Point{ public: Point(int xx, int yy){ //构造函数 x = xx; y = yy;... //复制构造函数 int getX(){ return x; } int getY() { return y; } private: ...
  • 继承和动态内存分配 ...对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的,如果不这样做,将自动调用基类的默认构造函数,对于赋值运算符,这是通过使用域解析运算符显示地调用
  • 由于vec中的对象定义了移动构造函数且是可用的(因为我们将其声明为了noexcept),所以就会调用移动构造函数将vec中原始的那个对象移动到新的内存中,从而输出 “移动构造函数”。 4、第四个 “移动构造函数” ...
  • 拷贝构造函数详解

    千次阅读 2021-02-02 15:04:44
    拷贝构造函数是构造函数的一种, 也称复制构造函数, 只有一个参数, 参数类型是该类的引用. [拷贝构造函数的参数可以是 const 引用,也可以是非 const 引用。 一般使用前者,这样既能以常量对象(初始化后值不能...
  • 何时会调用拷贝构造函数

    千次阅读 2020-08-25 22:23:38
    调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参完全相同的值。③ 函数的返回.
  • C++拷贝构造函数被调用的时机

    千次阅读 多人点赞 2017-07-28 17:41:59
    拷贝构造函数调用的几种情况: 1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值。 2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造...
  • //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在定义实例p时初始化p 2、对象作为函数的参数进行值传递时 f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建...
  • 复制构造函数被调用的三种情况------新标准c++程序设计 1、当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用。例如,下面的两条语句都会引发复制构造函数调用,用以初始化c2...
  • c++中的构造函数分为构造函数,和拷贝(复制)构造函数,相比于构造函数,复制构造函数使用更加方便,快捷。构造函数可以有多个,而拷贝构造函数只能有一个,因为拷贝构造函数的参数只能是当前类的一个对象,参数表...
  • 什么有指针成员的类,要自定义拷贝构造函数 https://blog.csdn.net/caoshangpa/article/details/79226270 没有拷贝构造函数的类,系统会创建默认的拷贝构造函数。(默认拷贝构造函数是浅拷贝,将指针指向旧的...
  • C++ 函数返回值为对象时调用复制构造...– 但是实际测试的时候,当调用返回值为对象的函数时,并未按预想地调用复制构造函数。 – 在查阅了很多博客资料后,原因如下: 当调用返回值为对象的函数时,系统消耗调...
  • 平时看C++,对复制构造函数,赋值函数的概念是知道的,但一直不太清楚在调用函数(函数形参是类)、从函数返回一个类对象以及赋值时,这些函数的调用关系具体是怎么样的。今天就来个了断。主要针对复制构造函数及...
  • 调用复制构造函数的三种情况:  1.当用类一个对象去初始化另一个对象时。  2.如果函数形参是类对象。  3.如果函数返回值是类对象,函数执行完成返回调用时。 #include <iostream> using namespace ...
  • C++构造函数详解及显示调用构造函数

    万次阅读 多人点赞 2018-10-08 10:55:11
    c++类的构造函数详解 一、 构造函数是干什么的 class Counter { public:  // 类Counter的构造函数  // 特点:以类名作为函数名,无返回类型  Counter()  {  ...
  • 复制构造函数

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

    万次阅读 多人点赞 2018-07-25 15:31:16
    一、拷贝构造函数是一种特殊的构造函数,其形参为本类的对 象引用。 class 类名  { public : 类名(形参);//构造函数  类名(类名 &amp;对象名);//拷贝构造函数 ... }; //拷贝构造函数 ...  类名...
  • ① 类内有自定义构造函数和自定义复制构造函数   根据C++标准定义,如果程序已定义构造函数,默认情况下编译器就不再隐含生成默认构造函数。注意,这里的“构造函数”包括复制构造函数(因为复制构造函数也是构造...
  • 先说点背景知识,调用复制构造函数的三种情况:  1.当用类一个对象去初始化另一个对象时。  2.如果函数形参是类对象。  3.如果函数返回值是类对象,函数执行完成返回调用时。  在辅导学生上机时,有同学第3...
  • C++ 复制构造函数

    2020-03-19 12:47:07
    1. 复制构造函数定义 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用,作用是用一个已存在的对象去初始化同类型的新对象。 class 类名{ public: 类名(形参); //构造函数 类名(const 类名 & ...
  • C++中类的构造函数与复制构造函数

    千次阅读 2017-04-27 10:52:42
    当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,此时就会通过直接调用自定义构造函数来初始化对象,而不再调用复制构造函数,完成优化”。这位朋友还提到,如果将复制构造函数改为...
  • 什么复制构造函数

    千次阅读 2016-03-14 13:58:06
    复制构造函数又称为拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。它存在唯一一个参数是不可变的。...这时,复制构造函数将会被调用,具体如下。 一个对象以

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 256,612
精华内容 102,644
关键字:

复制构造函数什么时候被调用