当前位置:编程学习 > C#/ASP.NET >>

在c++语言中,什么是拷贝构造函数呢,它有什么作用呢

在c++语言中,什么是拷贝构造函数呢,它有什么作用呢 --------------------编程问答-------------------- 拷贝构造函数就是把一个对象的值赋给另一个对象的一种简便方法。也可以说是用一个对象初始化另外一个对象的方法 --------------------编程问答-------------------- 这是清华大学的教程中讲解,参考

=============================================================
对一个简单变量的初始化方法是用一个常量或变量初始化另一个变量,例如:
  int m = 80;
  int n = m;
  我们已经会用构造函数初始化对象,那么我们能不能象简单变量的初始化一样,直接用一个对象来初始化另一个对象呢?答案是肯定的。我们以前面定义的Point类为例:
  Point pt1(15, 25);
  Point pt2 = pt1;
后一个语句也可以写成:
  Point pt2( pt1);
它是用pt1初始化pt2,此时,pt2各个成员的值与pt1各个成员的值相同,也就是说,pt1各个成员的值被复制到pt2相应的成员当中。在这个初始化过程当中,实际上调用了一个复制构造函数。当我们没有显式定义一个复制构造函数时,编译器会隐式定义一个缺省的复制构造函数,它是一个内联的、公有的成员,它具有下面的原型形式:
  Point:: Point (const Point &);
可见,复制构造函数与构造函数的不同之处在于形参,前者的形参是Point对象的引用,其功能是将一个对象的每一个成员复制到另一个对象对应的成员当中。
  虽然没有必要,我们也可以为Point类显式定义一个复制构造函数:
  Point:: Point (const Point &pt)
  {
   xVal=pt. xVal;
   yVal=pt. yVal;
  } 
  如果一个类中有指针成员,使用缺省的复制构造函数初始化对象就会出现问题。为了说明存在的问题,我们假定对象A与对象B是相同的类,有一个指针成员,指向对象C。当用对象B初始化对象A时,缺省的复制构造函数将B中每一个成员的值复制到A的对应的成员当中,但并没有复制对象C。也就是说,对象A和对象B中的指针成员均指向对象C --------------------编程问答-------------------- 这是清华大学的教程中讲解,参考

=============================================================
对一个简单变量的初始化方法是用一个常量或变量初始化另一个变量,例如:
  int m = 80;
  int n = m;
  我们已经会用构造函数初始化对象,那么我们能不能象简单变量的初始化一样,直接用一个对象来初始化另一个对象呢?答案是肯定的。我们以前面定义的Point类为例:
  Point pt1(15, 25);
  Point pt2 = pt1;
后一个语句也可以写成:
  Point pt2( pt1);
它是用pt1初始化pt2,此时,pt2各个成员的值与pt1各个成员的值相同,也就是说,pt1各个成员的值被复制到pt2相应的成员当中。在这个初始化过程当中,实际上调用了一个复制构造函数。当我们没有显式定义一个复制构造函数时,编译器会隐式定义一个缺省的复制构造函数,它是一个内联的、公有的成员,它具有下面的原型形式:
  Point:: Point (const Point &);
可见,复制构造函数与构造函数的不同之处在于形参,前者的形参是Point对象的引用,其功能是将一个对象的每一个成员复制到另一个对象对应的成员当中。
  虽然没有必要,我们也可以为Point类显式定义一个复制构造函数:
  Point:: Point (const Point &pt)
  {
   xVal=pt. xVal;
   yVal=pt. yVal;
  }  
  如果一个类中有指针成员,使用缺省的复制构造函数初始化对象就会出现问题。为了说明存在的问题,我们假定对象A与对象B是相同的类,有一个指针成员,指向对象C。当用对象B初始化对象A时,缺省的复制构造函数将B中每一个成员的值复制到A的对应的成员当中,但并没有复制对象C。也就是说,对象A和对象B中的指针成员均指向对象C --------------------编程问答-------------------- 拷贝构造函数简单地说,就是拷贝时候调用的构造函数。 --------------------编程问答-------------------- 学习学习,顺便拿十分。 --------------------编程问答-------------------- 拷贝构造函数就是把一个对象复制给另一个对象时调用的构造函数
当类中没有指针类型的数据成员时可以通过调用默认的构造函数(是按位拷贝,所以两个对象指针所指向相同的内存,当对象被销毁时,会调用各自的析构函数,这样也就把这块内存释放了两次,引发错误)就可以
而类中有指针类型的数据成员事就要调用自己写的拷贝构造函数 避免指针所指向的内存被释放两次 --------------------编程问答-------------------- 我的理解:类对象给类对象赋值,就用到拷贝构造函数 --------------------编程问答-------------------- 几点注意:
1、你确定需要复制一个已经存在的对象
2、如果自己不定义,系统会生成一个默认的拷贝构造函数
3、如果对象有动态分配的内存,一般来说要么自定义拷贝构造函数进行深拷贝,要么就禁用拷贝构造函数
4、如果自定义了复制操作符:=,那么必须自定义拷贝构造函数 --------------------编程问答--------------------  同5楼,虚心学习 --------------------编程问答-------------------- 虚心学习~~ --------------------编程问答-------------------- 直接对类进行赋值 --------------------编程问答-------------------- 就是用另一个对象去生成一个新的副本呗  --------------------编程问答-------------------- 也就是浅拷贝和深拷贝的问题 --------------------编程问答--------------------
引用 6 楼 zuiyuezhou888 的回复:
拷贝构造函数就是把一个对象复制给另一个对象时调用的构造函数
当类中没有指针类型的数据成员时可以通过调用默认的构造函数(是按位拷贝,所以两个对象指针所指向相同的内存,当对象被销毁时,会调用各自的析构函数,这样也就把这块内存释放了两次,引发错误)就可以
而类中有指针类型的数据成员事就要调用自己写的拷贝构造函数 避免指针所指向的内存被释放两次


。。 --------------------编程问答-------------------- >>>>>>>>> --------------------编程问答-------------------- Point:: Point (const Point &pt)
就是这东西 --------------------编程问答-------------------- 好的 ,小菜鸟受教了! --------------------编程问答-------------------- 是编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。 --------------------编程问答-------------------- 不喜欢看书的孩子伤不起啊。上网或许是最快找到答案的方法。但是看书则是深入体会拷贝构造函数存在意义以及其运行顺序的方法。
个人感觉构造函数,以及拷贝构造函数整本书都是在讲类在内存——堆中调用顺序的过程。
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,