C++类的构造函数深入探讨

 

构造函数 :

  

 

 

                   

 

 

1. 各种构造函数被调用的情景

l   CExample obj;

会调用类的一个没有参数的构造函数 , 如果用户自己没有设置 , 系统也会为该类设计一个默认构造函数 , 也就是说一个类至少有一个构造函数

l   CExample obj(size);

会调用一个含有 size 输入参数的构造函数

l   CExample obj2 = obj;

对象声明时使用 = , 也相当于使用 (). 此处的 = 并不表示赋值操作 , 而是初始化操作 .

会调用一个拷贝构造函数 , 注意这里即使没有设置拷贝构造函数 , 这样的赋值也是可以的 , 也就是说 C++ 中的类本身对赋值等号 = 有一个默认的操作 , 那就是 :

完全的内存拷贝 , obj 里所有成员变量的值都拷贝到 obj2 相应的对象里去 . 这是系统默认的方法 , 但是这个方法有一个严重的问题就是如果类里面有指针的时候 ,

比如 pBuffer 拷贝值之后 obj obj2 里的 pBuffer 都指向同一块内存 , 这样很容易出现内存错乱 , 所有我们可以得到以下规则 :

应该为所有包含动态分配成员的类都提供拷贝构造函数 , 在拷贝构造函数中,可以根据传入的变量,复制指针所指向的资源。

l   CExample obj3(obj);

同上 , 调用拷贝构造函数

l   BOOL testfunc(CExample obj);

类以值传递的方式做为函数的参数时同样会调用拷贝构造函数

 

l   类对象做为函数返回值时

 

       

如上例子所示 , 函数内部申请了一个局部对象 , 最后返回这个对象 . 这个过程详细经过是 : 函数到结尾处调用 return theTest;

然后系统会根据 theTest 对象拷贝构造 一个临时对象 temp, 之后调用 theTest 的析构函数 , 之后再删除 theTest 所占的内存 .

而外部函数的调用者可访问的是临时对象 temp, 函数调用结束之后再删除该临时对象 temp.

 

2 重载 赋值 “=” 操作符

一般情况下含有动态分配内存的类还需要重载 = 操作符. 具体操作如下 :


  
 
====================================

3.问题思考:
[问题]
在定义拷贝构造函数时,我们使用了
 CExample::CExample(const CExample& RightSides), 但是如果使用下面的语句会有什么不同:
 CExample::CExample(const CExample RightSides),
其中区别是第一个是引用参数传递,
第二个是值传递.
[分析]
    如果使用值传递,那么就会在拷贝构造函数被调用时产生一个临时对象RightSides, 而这个对象目的是要把外部参数对象复制一个副本,但是这个复制过程应该是通过类的拷贝构造函数完成的,也就是说在拷贝构造函数还未定义的时候就要使用它,这样就会产生无限个临时对象,进入死循环.

所以拷贝构造函数参数的传递必须使用引用. 经过测试也发现使用值传递的方式编译都不通过.


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值