精华内容
下载资源
问答
  • 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

    展开全文
  • 复制构造函数什么时候被调用

    千次阅读 2013-07-30 12:00:02
    假设Person是一个类,复制构造函数调用会在以下几种情况下发生: 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在

    转自:http://www.slyar.com/blog/cpp-copy-constructor.html

     

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

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

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

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

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

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

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

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

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

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


    展开全文
  • 什么复制构造函数复制构造函数是一种特殊的构造函数,具有一般构造...那么复制构造函数一般在什么情况下被调用呢,有三种情况: (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;

    }

    展开全文
  • 假设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",确保数据的完整性和安全性。

    展开全文
  • //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在定义实例p时初始化p 2、对象作为函数的参数进行值传递时 f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建...
  •  那么我们定义的复制构造函数什么时候调用呢,总结起来,有如下五种情况,下面分别举例说明。  一、根据一个同类型对象显示或隐式初始化一个对象。  例如:  string str1 = 123456;//copy-initialization...
  • 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。...Java不支持像C++那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。 Ja...
  • ps:看书的时候总被复制构造函数,析构函数所困扰,动不...1,新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。这种情况很多,最常见的情况是将新对象显示地初始化为现有的对象。 2,当程序生成了
  • 何时会调用拷贝构造函数

    千次阅读 2020-08-25 22:23:38
    拷贝构造函数什么时候用到 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用...
  • //用对象c2初始化对象c3,复制构造函数被调用 Complex myComplex,a; //定义两个对象 float R1,I1,R2,I2; cin>>R1>>I1; cin>>R2>>I2; myComplex.getRI(R1,I1); a.getRI(R2,I2); cout复数myComplex为...
  • C++:复制构造函数什么时候被调用?它和operator = 区分 1、对象在创建时使用其他的对象初始化 Person p(q); //此时复制构造函数被用来创建实例p Person p = q; //此时复制构造函数被用来在定义实例p时...
  • 构造函数

    2017-12-10 09:54:31
    C++构造函数什么时候调用   1、在声明对象是调用(这点与java不同,java在声明是只是维护一个引用,并不会在内存中开辟空间,而是在碰到new的时候才会在内存中开辟空间)Persion p//此时  2、对象在创建时使用...
  • 5、类型转换构造函数

    2019-11-24 21:00:33
    1、类型转换构造函数的概念 类型转换构造函数是这样一种构造函数:它只有一个参数,而且它不是属于复制构造函数的构造函数,一般...3、类型转换构造函数什么时候被调用? (1)发生在初始化语句。 上述情况是指在定...
  • //用对象c2初始化对象c3,复制构造函数被调用 float R1,I1,R2,I2; cin>>R1>>I1; cin>>R2>>I2; c2.getRI(R1,I1); c3.getRI(R2,I2); cout复数c2为:"; c2.output(); cout复数c3为:"; c3.output()...
  • 构造函数是干什么的 该类对象创建的时候,编译系统对象分配内存空间,并自动调用该构造...● 复制构造函数(拷贝构造函数) ● 一种特殊的构造函数,当对象之间复制时会自动调用拷贝构造函数 ● 若类中没有...
  • 构造ccc的时候调用一次复制构造函数从aaa那里构造出新对象了 但是放到复制构造函数参数里面如果不是引用而是用aaa传值的话 就会像下面说的 ----------------------------- 构造ccc,实质上是ccc.CExample(aaa); ...
  • 什么类的拷贝构造函数的参数必须是引用(解决方法来源与CSDN)(1) 我首先想如果传值为什么不可以呢,传值可以完成所有的数据成员的复制...时,拷贝构造函数被调用, 当我们传值t1的时候,我们在函数里面操作的都
  • 当新对象被创建的时候构造函数被调用。 每一个类都有构造函数。 在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。 Java中构造函数重载和方法重载很相似。 可以为一个类...
  • 1.定义一个矩形类,有长,宽两个属性,有成员函数计算矩形的面积。 在该矩形类中,我做了5个主要的测试。 构造函数带默认值参数,利用默认值参数计算矩形面积:rectangle...测试复制构造函数什么时候被调用:...
  • 异常对象在什么时候构造?  1、按传值的方式传递异常对象时,抛出的异常都是局部变量,而且是临时的局部变量。什么是临时的局部变量,这大家可能都知道,例如发生函数调用时,按值传递的参数就会临时复制一...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

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