精华内容
下载资源
问答
  • 拷贝构造函数和浅拷贝构造函数 拷贝构造函数有深拷贝构造函数和浅拷贝构造函数 分类:拷贝构造函数分为深拷贝构造函数和浅拷贝构造函数。 区别:浅拷贝,即只复制对象空间,不复制对象资源。 深拷贝,既复制...

    深拷贝构造函数和浅拷贝构造函数

    • 拷贝构造函数有深拷贝构造函数和浅拷贝构造函数

    分类:拷贝构造函数分为深拷贝构造函数和浅拷贝构造函数。
    区别:浅拷贝,即只复制对象空间,不复制对象资源。
    深拷贝,既复制对象空间又复制资源。
    由C++语言提供的默认拷贝构造函数只是对对象进行浅拷贝逐个成员依次拷贝。

    浅拷贝
    ~~在这里插入图片描述~~

    深拷贝和浅拷贝只在z指针变量中才有的说法,指针对象要用深拷贝,可是其他变量就不用。

    深拷贝

    在这里插入图片描述

    当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象。所以,这时,必须采用深拷贝。

    #include <iostream>
    using namespace std;
    
    class sb {
    	public:
    		sb(char *na) //构造函数
    		{
    			cout << "FG ?" << endl;
    			name = new char[strlen(na) + 1];//new进行分配
    			if (name != 0) 
    			{
    				strcpy(name, na);
    			}
    		}
    		sb(sb &p) //深拷贝构造函数
    		{
    			cout << "FG win !" << endl;
    			name = new char[strlen(p.name) + 1];//复制资源
    			if (name != 0)
    				strcpy(name, p.name);//复制对象空间
    		}
    		void print() 
    		{
    			cout << name << endl;
    		}
    		~sb() 
    		{
    			delete name;
    		}
    	private:
    		char *name;
    };
    
    int main () {
    	sb niubi("wang");
    	sb li(niubi);
    	niubi.print();
    	li.print();
    	return 0;
    }
    
    展开全文
  • 拷贝构造函数和赋值构造函数能否进行值传递 拷贝构造函数(不能进行值传递) 赋值构造函数(可进行值传递) 拷贝构造函数和赋值构造函数能否进行值传递 C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,...

    目录

    拷贝构造函数和赋值构造函数能否进行值传递

    拷贝构造函数(不能进行值传递)

    赋值构造函数(可进行值传递)


    拷贝构造函数和赋值构造函数能否进行值传递

      C++ 中拷贝赋值函数的形参能否进行值传递?我知道一般来说,拷贝构造函数的形参必须是自身类型的引用;但是拷贝赋值函数的形参通常也是自身类型的引用,实际上拷贝赋值函数能进行值传递。

    拷贝构造函数(不能进行值传递)

    拷贝构造函数具有如下两种形式:

    // 拷贝构造函数原型
    
    Person(Person&);  // method 1
    
    Person(const Person&);  // method 2
    
    
    // 下面这种原型是错的
    
    Person(Person);  // 不能进行值传递,只能传递引用

    不能进行值传递的原因:

      如果自身参数不是引用,则永远不会调用成功------为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝实参,我们又必须调用拷贝构造函数,如此无限循环,栈满,无法完成拷贝。

    赋值构造函数(可进行值传递)

    拷贝赋值函数的原型:

    // 拷贝赋值函数原型
    
    Person & operator=(const Person&);

    为了与内置类型的赋值保持一致,赋值运算符通常返回一个指向其左侧运算对象的引用,这样就可以实现连等的功能(a = b = c)。为了验证我们的猜测(能进行值传递),我们做了一下验证,代码如下:

        class A {
        public:
            A() :a(0) {}
            
            //A(A other) { this->a = other.a; }//1.拷贝构造函数,报错
            A(A& other) { this->a = other.a; }
            A(const A& other) { this->a=a; }
            A(int k) { a = k; }
            A & operator=(A other) { // 进行值传递而非引用传递
                this->a = other.a;  
                return other;
            }
            int get() { return a; }
            ~A() {}
        private:
            int a;
        };
        
        void test()
        {
            A mya1(1);
            A mya2(mya1);
            A mya3;
            mya3=mya2 = mya1;
            cout <<mya3.get()<<","<< mya2.get() << endl;
        }

    转载自:https://www.cnblogs.com/zpcoding/p/10808547.html

    展开全文
  • 编译器永远不会把模板构造函数视为构造函数,即使客户没有自己定义拷贝构造函数,编译器也会生成一个默认的拷贝构造函数,这种情况同样存在于拷贝赋值函数和模板拷贝赋值函数。请看下面的例子:...

    类(包括模板类)构造函数是真实的构造函数;然而模板构造函数,其实质是模板函数。两者不能混为一谈。在一个模板类中,构造函数和模板构造函数同时存在时,优先调用构造函数。只有当确切符合模板构造函数的接口时,才调用模板构造函数。编译器永远不会把模板构造函数视为构造函数,即使客户没有自己定义拷贝构造函数,编译器也会生成一个默认的拷贝构造函数,这种情况同样存在于拷贝赋值函数和模板拷贝赋值函数。请看下面的例子:

    #include <iostream> 
    using namespace std; 
    template <typename T> 
    class TempClass{ 
    public: 
        T d; 
        //两个构造函数,其中第二个是拷贝构造函数 
        TempClass<T>(T _d=0):d(_d){cout<<"This is TempClass Constructor1. "<<endl;}; 
        TempClass<T>(TempClass<T> &_tmp):d(_tmp.d){cout<<"This is TempClass Constructor2. "<<endl;}; 
        
        template <typename O> //模板构造函数 
        TempClass<T>(TempClass<O> &_tmp):d(_tmp.d){cout<<"This is a template constructor, not a TempClass Constructor."<<endl;}; 
    }; 
    int main() 
    { 
        TempClass<int> a; 
        TempClass<int> b(a); //调用拷贝构造函数,即使在该模板类中用户没有自定义该函数,编译器也会生成一个默认拷贝构造函数。因为编译器永远不会认为一个模板构造函数是一个构造函数 
        
        TempClass<double> c(a); //调用模板拷贝构造函数 
        
        return 0; 
    } 
    

    输出结果是:

    This is TempClass Constructor1.
    This is TempClass Constructor2.
    This is a template constructor, not a TempClass Constructor.

    PS:具体可以参考《Exceptional C++》之Item5

    展开全文
  • 拷贝构造函数实现按值传递方式的参数传递返回,使用在这种简单结构下, 编译器将有效地创建一个默认拷贝构造函数 当包括更复杂的类型时,如果没有创建拷贝构造函数,C++编译器会自动地 创建拷贝构造函数 编译器...

    拷贝构造函数实现按值传递方式的参数传递和返回,使用在这种简单结构下,
    编译器将有效地创建一个默认拷贝构造函数

    当包括更复杂的类型时,如果没有创建拷贝构造函数,C++编译器会自动地
    创建拷贝构造函数

    编译器采用更聪明的方法,设想创建了一个新类,它是由某些现有类的对象
    组成的。

    当编译器为新类创建默认拷贝构造函数时,编译器做了哪些事

     

    //: C11:DefaultCopyConstructor.cpp
    // From Thinking in C++, 2nd Edition
    // Available at http://www.BruceEckel.com
    // (c) Bruce Eckel 2000
    // Copyright notice in Copyright.txt
    // Automatic creation of the copy-constructor
    #include <iostream>
    #include <string>
    using namespace std;
    
    class WithCC { // With copy-constructor
    public:
      // Explicit default constructor required:
      WithCC() {}
      WithCC(const WithCC&) {
        cout << "WithCC(WithCC&)" << endl;
      }
    };
    
    class WoCC { // Without copy-constructor
      string id;
    public:
      WoCC(const string& ident = "") : id(ident) {}
      void print(const string& msg = "") const {
        if(msg.size() != 0) cout << msg << ": ";
        cout << id << endl;
      }
    };
    
    class Composite {
      WithCC withcc; // Embedded objects
      WoCC wocc;
    public:
      Composite() : wocc("Composite()") {}
      void print(const string& msg = "") const {
        wocc.print(msg);
      }
    };
    
    int main() {
      Composite c;
      c.print("Contents of c");
      cout << "Calling Composite copy-constructor"
           << endl;
      Composite c2 = c;  // Calls copy-constructor
      c2.print("Contents of c2");
      getchar();
    } ///:~

     

    类WithCC有一个拷贝构造函数,这个函数只是简单地宣布它被调用

    类WoCC没有拷贝构造函数,但它的构造函数将在内部string中存储一个信息,
    这个信息可以使用print()函数打印出来

    类Composite即含有WithCC类的成员对象又含有WoCC类的成员对象

    为了对使用组合的类创建拷贝构造函数,编译器递归地为所有的成员对象和基类
    调用拷贝构造函数

    最好的方法是创建自己的拷贝构造函数而不让编译器创建。保证程序在我们
    的控制之下

    输出
    Contents of c: Composite()
    Calling Composite copy-constructor
    WithCC(WithCC&)
    Contents of c2: Composite()

    展开全文
  • 构造函数与拷贝构造函数

    千次阅读 2019-04-03 09:07:15
    拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。 众所周知,构造函数是一个初始化类对象的函数...
  • 1.c++的默认拷贝构造函数,从深度拷贝浅拷贝说起 c++类的默认拷贝构造函数的弊端 c++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数。它们的特殊之处在于: (1)当类中没有定义任何构造函数时,...
  • 拷贝构造函数 拷贝构造函数是构造函数的一种 拷贝构造函数的格式是固定的,接收一个const引用作为参数 当利用已存在的对象创建一个新对象时(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化 class Person{...
  • C++中一般创建对象,拷贝或赋值的方式有构造...·默认构造函数和拷贝构造函数 ·析构函数 ·赋值函数(赋值运算符) ·取值函数 **即使程序没定义任何成员,编译器也会插入以上的函数! 注意:构造函数可以被重载,
  • 拷贝构造函数和拷贝赋值函数

    千次阅读 2018-03-12 23:40:01
    拷贝构造函数和拷贝赋值函数的区别 拷贝构造函数是针对一个未存在的对象进行初始化;拷贝赋值函数是针对已存在的对象进行初始化。 A a; A b = a; //拷贝构造 A c; b = c; //拷贝赋值 怎么避免一个对象给...
  • 拷贝构造函数,顾名思义,也是一种构造函数,特殊的构造函数,用一个已存在的对象初始化一个新的对象,就是拷贝构造函数。如下调用的就是拷贝构造函数,用已经存在的string s去初始化新的对象a: String a(s);...
  • 构造函数包括默认构造函数、拷贝构造函数和一般构造函数。 在编程时,如果程序员不显式声明和定义上述函数,编译器将自动产生4个public inline的默认函数。 A(); // 默认构造函数 A(const A&); // 拷贝...
  • 一、拷贝构造函数 功能:使用一个已经存在的对象来初始化一个新的同一类型的对象 声明:只有一个参数并且参数为该类对象的引用 注意:如果类中没有说明拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类...
  • 默认构造函数和拷贝构造函数 析构函数 赋值函数(赋值运算符) 取值函数 **即使程序没定义任何成员,编译器也会插入以上的函数! 注意:构造函数可以被重载,可以多个,可以带参数;析构函数只有一个,不能被重载,...
  • 拷贝构造函数是一种特殊的构造函数,用基于同一类的一个对象构造初始化另一个对象。当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值函数。拷贝构造函数是一个对象初始化一块内存区域,这块内存就是新...
  • 文章目录1.拷贝构造函数和构造函数的区别2.拷贝构造函数在什么情况下会被调用3.重载运算符的理解 1.拷贝构造函数和构造函数的区别 2.拷贝构造函数在什么情况下会被调用 3.重载运算符的理解 ...
  • 拷贝构造函数和移动构造函数解析

    千次阅读 2017-12-05 14:33:37
    移动构造函数和拷贝构造函数
  • 文章目录1、拷贝构造函数和赋值运算符2、两者分别在何时调用3、深拷贝、浅拷贝:拷贝构造函数和赋值运算符函数的必要性和意义 本文前面主要介绍了拷贝构造函数和赋值运算符函数的区别,以及在什么时候调用拷贝构造...
  • 首先看拷贝构造函数: //拷贝构造函数 A(A& t) { if(t.text!=NULL) { int len=strlen(t.text); text=new char[len+1]; strcpy(text,t.text); } } 拷贝构造函数中实现了深拷贝处理。再...
  • 不会把拷贝构造函数隐藏掉; 显示的提供一个拷贝构造的函数的时候,默认的拷贝构造函数就会被隐藏; 只有提供一个显示的析构函数,才会将默认的析构 2 classTeacher { 3 public: 4 //有参数的构造函数 ...
  • 拷贝构造函数和赋值函数

    千次阅读 2018-05-31 11:26:37
    本文主要是对拷贝构造函数和赋值函数已经深拷贝、浅拷贝的总结归纳。 拷贝构造函数 如果构造函数第一个参数为自身类类型的引用,且任何额外参数都具有默认值,则此构造函数为拷贝构造函数。 class Foo { public...
  • 2 当没有自定义的拷贝构造函数时,系统自动生成一个拷贝构造函数 3 通过同类型的对象实例化另外的对象时,自动调用拷贝构造函数 4 拷贝构造函数没有返回值 析构函数 1.如果没有自定义的析构函数则系统自动生成...
  • 好习惯:自定义拷贝构造函数 几种对象的复制(拷贝)情况 1.变量对象之间的复制 如下:执行完后a,b互不影响。 int a=10; int b=a; 2.指针对象间的复制 只是将其值复制(也就是地址)。拷贝完成后两个指针...
  • 假定numbered使用合成的拷贝构造函数成员,并给出如下函数: void f(numbered s) { cout&lt;&lt;s.mysn&lt;&lt;endl; } 则下面代码输出什么内容? numbered a,b = a, c = b; f(a); f(b)...
  • 昨天晚上在看智能指针的时候,我发现自己连一个拷贝构造函数和赋值构造函数都写不出来,自己就尝试写了一个版本,结果发现错误百出,对于拷贝构造函数和赋值构造函数的理解仅仅停留在理论的方面,而不知其中太多的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,560
精华内容 3,424
关键字:

拷贝构造函数和构造函数