`
febird
  • 浏览: 247297 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++ 中让对象的拷贝成为 显式 的

阅读更多

C++中对象的拷贝一般使用拷贝构造函数,从而对象的拷贝大多是隐式的,使用拷贝构造函数的隐式拷贝很方便,但是编译器无法识别不必要的拷贝,虽然我们人类可以识别这些不必要的拷贝,比如在写函数原型时,忘了加&,就会引发一个这样的非必要拷贝。

如果这种情况很严重,我们可以禁用拷贝构造函数和赋值函数(声明成private),然后再提供一个显式拷贝函数,如:

这种方法的确可以work,但看上去很不自然,比如:

x = y.clone(); 在形式上很自然,但是实现却不容易(在C++11中实现要容易点,让 x 接受 && 即可)。

但的确可以实现:在 C++98 标准中,如果一个函数返回一个非 Primitive 的值对象,那么这个对象不能被 bind 到非 const 引用上, 但是可以被修改

我们可以利用标准的这个特点:

当执行 x = y.clone() 时,clone 调用Ref1(const HeavyObject& y) 创建一个临时对象并按值返回,该对象不能 bind 到 non-const reference,但可以被修改!

接下来该对象被传给HeavyObject::operator=,但该 operator= 只接受 Ref2& 或 const HeavyObject&,于是,编译器需要调用一个 user defined type conversion, 在这里,就是Ref1::operator Ref2&,该函数是 non-const,可以被调用(记得前面说的:不能 bind 到 non-const reference,但可以被修改,从而就可以调用 non-const member function)……

于是,接下来的事情就很简单了……


分享到:
评论

相关推荐

    C++对象和指针的引用

    所以,在C++编程中,人们喜欢用对象引用作函数参数。现举一例子说明对象引用作函数参数的格式。 #include class M { public: M() { x=y=0; } M(int i, int j) { x=i; y=j; } void copy(M &m); void setxy...

    C++和面向对象数值计算

    6.4 显式和隐式类型转换 6.5 效率和运算符重载 6.6 共扼梯度算法 6.7 练习 第7章 模板 7.1 类模板 7.1.1 成员和友元定义 7.1.2 模板实例化 7.1.3 模板参数 7.1.4 类型等价 7.1.5 用户定义...

    C++中拷贝构造函数的应用

    C++中拷贝构造函数的定义  有一个参数的类型是其类类型的构造函数是为拷贝构造函数。如下:  X::X( const X& x);  Y::Y( const Y& y, int =0 );  //可以是多参数形式,但其第二个即后继参数都有一个默认值 ...

    C++中拷贝构造函数的应用详解

    一、C++中拷贝构造函数的定义: 有一个参数的类型是其类类型的构造函数是为拷贝构造函数。 如下所示: X::X( const X& x); Y::Y( const Y& y, int =0 ); //可以是多参数形式,但其第二个即后继参数都有一个默认值 ...

    新手学习C++入门资料

    标准C++的iostream类库中包括了可以支持宽字符的类和对象。用wout替代cout即可。 #include iostream.h int main() { wchar_t wc; wc='b'; wout; wc='y'; wout; wc='e'; wout; return 0; } 说明一下...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1  1.1 编写一个简单的C++程序 2  1.1.1 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1  1.1 编写一个简单的C++程序 2  1.1.1 ...

    摩托罗拉C++面试题

    10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。 深拷贝意味着拷贝了资源和指针,而浅拷贝只是拷贝了指针,没有拷贝资源 这样使得两个指针指向同一份资源,造成对同一份析构两次,程序崩溃。 临时对象的...

    Effective.C++.中文第二版.50条款doc文档.chm

    Effective.C++.中文第二版,大小 1 Mb,chm 格式,作者:Scott Meyers,翻译:Lostmouse。 内容预览: 第一章 从C转向C++ 条款1:尽量用const和inline而不用#define 条款2:尽量用而不用 条款3:尽量用new和delete而...

    java 设计模式资料

    Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 Proxy:为其他对象提供一个代理以控制对这个对象的访问。 Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    vc++ 开发实例源码包

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 如题。 FreeBird2011最初版(模仿...

    vc++ 应用源码包_6

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    VC++6.0核心编程源码.rar

    如果FormatMessage函数运行成功,那么错误代码的文本描述就位于内存块中,我将它拷贝到对话框底部的滚动窗口中。如果FormatMesage函数运行失败,我设法查看NetMsg.dll模块中的消息代码,以了解该错误是否与网络有关...

    vc++ 应用源码包_1

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_2

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_5

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_3

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

Global site tag (gtag.js) - Google Analytics