精华内容
下载资源
问答
  • 关于为什么拷贝构造函数参数必须使用引用

    千次阅读 多人点赞 2019-07-30 10:53:44
    Data(const Data&d) :_year(d._year) ...首先要明确一点,拷贝构造函数只有一个函数,而且必须引用传参 如果直接传对象,比如这样 Data(const Data d) {} 这里参数的Data d又会实例化一个对象,调用拷贝函数,...
    Data(const Data&d)
    		:_year(d._year)
    		, _month(d._month)
    		, _day(d._day)
    	{
    	}
    

    我从练习代码里拿来的一个拷贝构造函数
    首先要明确一点,拷贝构造函数只有一个函数,而且必须引用传参
    如果直接传对象,比如这样

    Data(const Data d)
    	{}
    

    这里参数的Data d又会实例化一个对象,调用拷贝函数,但是拷贝构造函数被调用后又实例化了一个对象,再次调用了拷贝构造函数,形成无限递归,所以,必须引用嗷,不然没你好果汁吃

    展开全文
  • 1.什么时候会调用拷贝构造函数? #include <iostream> using namespace std; class CCTest{ public:  int m_nTest2;  CCTest(int x,int y): m_nTest(x) ,m_nTest2(y)  {  cout &lt...

    1.什么时候会调用拷贝构造函数?

    1. #include <iostream>
      using namespace std;

      class CCTest{
      public:
          int m_nTest2;
          CCTest(int x,int y): m_nTest(x) ,m_nTest2(y)
          {
              cout <<"constructor with argument"<<endl;
          }
          CCTest(const  CCTest &ex)//
          {
              m_nTest = ex.m_nTest;
              m_nTest2 = ex.m_nTest2;
              cout<<"copy constructor"<<endl;
          }
          
          int GetVal()
          {
              return m_nTest;
          }
          
          CCTest& operator = (const CCTest &ex) //赋值运算符重载
          {
              this->m_nTest = ex.m_nTest;
              this->m_nTest2 = ex.m_nTest2;
              cout <<"assignment operator" <<endl;

              return *this;
          }

          void myTestFunc(CCTest ex)//参数为引用的话调用该函数时,拷贝构造函数不会被调用
          {
          }

          CCTest testFunc2()// 如果返回的是对象的引用,则不会调用拷贝构造函数
          {
              cout<<"testFunc2() with a class obj returned!"<<endl;
              CCTest a(1,1);
              CCTest &b =a;
              return b;
          }
          ~CCTest()
          {
             
          }
      private:
          int m_nTest;
      };

      int main()
      {
          CCTest aaa(2,1);
          CCTest bbb(aaa);   //1.用类的对象去初始化另一个对象
          CCTest ccc = aaa;

          ccc.myTestFunc(aaa); //2.形参为类对象,实参初始化形参
          CCTest ddd =  ccc.testFunc2(); //3.函数返回一个类对象时
          return 0;
      }
      运行结果:constructor with argument
      copy constructor
      copy constructor
      copy constructor
      testFunc2() with a class obj returned!
      constructor with argument
      copy constructorr

    写了个以类指针为参数的“拷贝构造函数”

        CCTest(CCTest *p)
        {
            m_nTest = p->m_nTest;
            m_nTest2 = p->m_nTest2;

            cout <<"copy constructor with point arg"<<endl;
        }

    在mian()函数中   CCTest aaa(2,1);   CCTest *p = &aaa;  CCTest bbb(p) ;//CCTest bbb = p也可以

    运行结果:constructor with argument
                      copy constructor with point arg

    至于拷贝构造函数的参数为什么规定为类对象的引用,结合众多网友的见解:1.历史原因  2.以指针作为参数只适用于某些简单的情况,如果一个函数的返回值为类指针,此时内存管理很不方便 3.引用使代码的可读性和维护性更好

    ps:若有纰漏之处,请大神多多指教,不喜勿碰哟!

     

    展开全文
  • 拷贝构造函数 写成如下的几种方式CExample(CExample ex){} // 直接编译错误,不允许为CExample类型CExample(CExample &ex){} // 是拷贝构造函数CExample(const CExample &ex){} // 是拷贝构造函数CExample(const ...

    对于class CExample{};

    拷贝构造函数 写成如下的几种方式

    CExample(CExample ex){}   // 直接编译错误,不允许为CExample类型
    CExample(CExample &ex){} // 是拷贝构造函数
    CExample(const CExample &ex){} // 是拷贝构造函数
    CExample(const CExample* c_class){} // 不是拷贝构造函数,参数是指针类型,而非对象
    CExample& operator = (const CExample &ex)   //赋值函数(赋值运算符重载)

    拷贝构造函数是必须要带引用类型的参数的, 而且这也是编译器强制性要求的

    • 使用引用相对于一般的变量参数,减少了一次内存拷贝
    • 使用const 是限定参数对象是只读的,避免犯错,建议加上const
    • 拷贝构造函数涉及到 深拷贝浅拷贝

    • 当拷贝构造不是引用而是直接对象时,根据拷贝构造的调用时机
      (参考:http://blog.csdn.net/qq_26437925/article/details/52125844
      显然CExample ce2(ce1), 会默认调用一次拷贝构造函数(ce1作为普通参数对象),这时调用的是ce1自己的拷贝构造函数,这时候又要调用自己的拷贝构造函数,会永远的递归下去。使用引用可以避免无限递归



    两篇原文如下

    http://www.cnblogs.com/this-543273659/archive/2011/09/18/2180575.html

    http://blog.sina.com.cn/s/blog_88b95c430100uqt0.html


    拷贝函数注意点

    • 拷贝函数和构造函数没有返回值

    • 拷贝构造函数的参数可以使一个或多个,但左起第一个必须是类的引用对象

    • 若类定义中没有声明拷贝构造函数,则编译器会自动生成一个缺省的拷贝构造函数,但是不会是该类的保护成员

    这里写图片描述


    展开全文
  • 如果是传值的话,会在传值时调用拷贝构造函数,所以会成为一个死循环,如果是指针的话,指针太灵活有时还可以是空,这样去调构造函数当然是不行的。 所以只能是引用,引用不可能为空,而且一定是指向一个对象的。

    如果是传值的话,会在传值时调用拷贝构造函数,所以会成为一个死循环,如果是指针的话,指针太灵活有时还可以是空,这样去调构造函数当然是不行的。

    所以只能是引用,引用不可能为空,而且一定是指向一个对象的。

    展开全文
  • Received: by mail.email.jlu.edu.cn (ecMail, from userid 99)To:Subject: helpDate: Sun, 10 Oct 2004 11:00:03 +0800From: 阿超玉良: 为什么在C++中拷贝构造函数只有一个参数的时候为什么不能是对象,而必须是...
  • 拷贝构造函数,默认拷贝构造函数 1.c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起 c++类的默认拷贝构造函数的弊端 c++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数。它们的特殊之处在于: (1)...
  • 拷贝构造函数参数

    2019-07-14 15:09:01
    拷贝构造函数和拷贝赋值函数 ...1. 拷贝构造函数参数 1.1 使用不加const的拷贝构造函数 #include <iostream> class A { public: A(){std::cout << "A construct." <...
  • 拷贝构造函数

    2021-02-27 23:36:09
    拷贝构造函数 概念 在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。...2.拷贝构造函数参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。 class Date { public: Date(int
  • 编译器永远不会把模板构造函数视为构造函数,即使客户没有自己定义拷贝构造函数,编译器也会生成一个默认的拷贝构造函数,这种情况同样存在于拷贝赋值函数和模板拷贝赋值函数。请看下面的例子:...
  • 构造函数与拷贝构造函数

    千次阅读 多人点赞 2019-04-03 09:07:15
    拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。 众所周知,构造函数是一个初始化类对象的函数...
  • 可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。...
  •  在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数... 但是如果我问你“拷贝构造函数参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第
  • 一、拷贝构造函数 功能:使用一个已经存在的对象来初始化一个新的同一类型的对象 声明:只有一个参数并且参数为该类对象的引用 注意:如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类...
  • C++拷贝构造函数详解

    万次阅读 多人点赞 2011-02-23 13:39:00
    什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 下面看一个类对象...
  • 1 拷贝构造函数参数是确定的,不能重载 2 当没有自定义的拷贝构造函数时,系统自动生成一个拷贝构造函数 3 通过同类型的对象实例化另外的对象时,自动调用拷贝构造函数 4 拷贝构造函数没有返回值 析构函数 ...
  • 拷贝构造函数和拷贝赋值函数

    千次阅读 2018-03-12 23:40:01
    拷贝构造函数和拷贝赋值函数的区别 拷贝构造函数是针对一个未存在的对象进行初始化;拷贝赋值函数是针对已存在的对象进行初始化。 A a; A b = a; //拷贝构造 A c; b = c; //拷贝赋值 怎么避免一个对象给...
  • 拷贝构造函数(对象初始化对象的过程)4.1 前言4.2 什么是拷贝构造函数4.3 拷贝构造函数的特性4.4 拷贝构造函数参数中的const是否可以去掉4.5 拷贝构造函数参数中&是否可以去掉5. 1. 类的6个默认成员函数 如果一...
  • C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。 构造函数就是当创建一个类的对象时,它被调...拷贝构造函数首先是一个构造函数,它调用时候是通过参数的对象初始化产生一个对象。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,120
精华内容 66,848
关键字:

拷贝构造函数的参数