【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2409|回复: 1

拷贝构造函数---类对象的复制

[复制链接]
发表于 2009-3-5 20:29:59 | 显示全部楼层 |阅读模式

今天,一个学生问了我一个深拷贝的问题,突然间我发现这块知识我忘得光光的。就连拷贝构造函数和默认拷贝构造函数的关系也突然觉得模糊起来。下班以后就翻书查看了一下C++的书,觉得这个知识点还是很有必要在这里写出来与大家共勉。

这道题非常典型。

 

class A
{
public:
 A()
 {
  pchar = new char[100];
 }

 ~A()
 {
  delete pchar;
 }

 char * pchar;
};
void Fun(A s)
{

}
void main()
{
 A s;
 Fun(s);
 getchar();
}

 

 运行这段代码会报错,原因是函数Fun的形参存在一个拷贝类A的内存操作,而拷贝一个类 不同于拷贝一个int变量。

  如果我们要拷贝一个

   int i=5;

   int j = i;

   这样就完成了,但是对于一个类A的的对象之间的拷贝,就不是这么简单了。 

   类对象内部存在着成员变量,拷贝就不能按照普通成员的方式来拷贝,而是要通过拷贝构造函数来完成复制过程。但是在平常的代码书写的时候,我们并没有去执行拷贝构造函数,甚至从来在自己的类中从来没有写过拷贝构造函数,原因是系统会自动提供一个默认的拷贝构造函数。

 

下来我们改写上面的代码,通过拷贝构造函数我们就避免了上面方法的不足。

 

class A
{
public:
 A()
 {
  pchar = new char[100];
 }
 A(A &temP)
 {
  pchar = new char[100];
 }

 ~A()
 {
  delete pchar;
 }

 char * pchar;
};
void Fun(A s1)
{

}
void main()
{
 A s;
 Fun(s);
 getchar();
}

 

上面代码中的A(A &temP)就是我们自定义的拷贝构造函数,拷贝构造函数的名称必须与类名称一致,函数的形式参数是本类型的一个引用变量,且必须是引用

 当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用,如果你没有自定义拷贝构造函数的时候系统将会提供给一个默认的拷贝构造函数来完成这个过程。

 

[此贴子已经被作者于2009-3-6 14:12:09编辑过]
发表于 2009-3-10 12:55:30 | 显示全部楼层
学习中
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 13:17

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表