注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

拷贝构造函数和等赋值重载的考究  

2016-08-02 10:39:16|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

拷贝构造函数和等赋值重载的考究

在最近几天一直遇到几个基础的问题,虽然心里知道是怎么回事儿,但在使用的时候儿跟别人讲总是讲不太清楚,其实说白了,还是自己没有从根本上了解清楚,其中就有一个是“拷贝构造函数和等赋值重载区别”的问题,或者说,类对象的声明和定义的细微区别之处,在这里就体现的很明显。

同学在学习编程时就会听到这样一种话,变量的声明和定义,那他们到底有什么不同呢?其实好多人是会用不知道。特别是在类对象的声明和定义上,到底有什么不同呢?同学们可以考虑静态变量,这个就扯远了,这里不深入说。

还是老样子,先看代码:

class CopyEqual

{

public:

         CopyEqual() {}

         ~CopyEqual() {}

         CopyEqual(const CopyEqual&ce)

         {

         }

public:

         CopyEqual&operator=(const CopyEqual&ce)

         {

                   return *this;

         }

private:

         int _num = 0;

         int _ref = 1;

};

int main()

{

         CopyEqual ce;               //1

         CopyEqual ceCopy(ce);       //2

         CopyEqual cEqual = ce;       //3

CopyEqual copye = CopyEqual();     //4

         CopyEqual cEq;                        //5

         cEq = ce;                              //6

cEq = CopyEqual();                //7

    return 0;

}

 

在第三版的C++Primer中,有下面的说明:

为构造函数指定实参有三种等价形式
// 一般等价的形式
Account  acct1( "Anna Press" );
Account  acct2 = Account( "Anna Press" );
Account  acct3 = "Anna Press";
acct3 的形式只能被用于指定单个实参的情形 对于两个以上的实参 只能使用 acct1
acct2 的形式 一般来说 我们推荐使用 acct1 的形式
// 推荐的构造函数形式
Account acct1( "Anna Press" );

对照上面贴的代码,大家明白了吧。14其实是一样的。同样,23也是一样的,同时调用拷贝构造函数,只不过2更让大家看上去象是一个拷贝构造函数。

5声明后然后进行67,就会调用=赋值操作运算符重载。

换句话说,操作运算符重载,是在对已经存在的一个对象用另外一个对象进行赋值时会调用。而如果是在声明和定义同时进行时,如3,就会调用拷贝构造函数而不是=操作运算符重载的函数。

67表明,左值才会是声明定义,右值嘛也不是啊。

这细个细节,需要在实际使用上小心应对,不可大意。

 

 

 

 

  评论这张
 
阅读(82)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017