`
febird
  • 浏览: 254229 次
  • 性别: 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++ 类与对象习题

    - **类定义**: C++中用来描述一类对象的共同特征和行为的概念。它是一个抽象数据类型,包含了数据成员和成员函数。 - **成员函数**: 定义在类中的函数,用于实现类的行为。 - **数据成员**: 定义在类中的变量,用于...

    C++简单类(构造函数,析构函数以及拷贝构造函数)的实现

    在C++编程语言中,类是面向对象编程的核心概念之一,它允许我们定义自己的数据类型,这些类型可以包含数据成员和成员函数。本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝...

    C++有子对象的派生类的构造函数

    2. 深拷贝与浅拷贝:在派生类构造函数中,如果子对象是其他类的引用或指针,需要确保正确处理深拷贝和浅拷贝问题,以防止意外的数据共享或丢失。 五、使用初始化列表 成员初始化列表是构造函数体之外的一段代码,...

    C++面向对象程序设计试题.doc

    4. **构造函数**:在C++中,当创建一个对象时,如果没有显式地指定参数,系统会调用无参构造函数来初始化该对象。选项B正确。 5. **非成员函数**:在C++中,友元函数虽然可以访问类的私有成员,但它并不是类的成员...

    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++实例.docx

    第四章重点关注字符串的处理,包括操作C++标准库中的`string`对象和C风格的字符数组。通过案例,学习了如何截断、复制、比较、连接字符串,以及将字符串转换为整数或反之。同时,介绍了如何处理输入输出,避免缓冲区...

    C++构造函数详解及显式调用构造函数.doc

    C++中的构造函数是类的一个特殊成员函数,其主要任务是初始化对象的数据成员。当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. ...

    1. 拷贝构造与拷贝赋值1

    拷贝构造和拷贝赋值是面向对象编程中两种重要的对象复制方式,它们在C++、Java和Python等编程语言中都有所体现,但实现机制和处理方式有所不同。本文主要探讨的是C++中的拷贝构造和拷贝赋值,以及浅拷贝和深拷贝的...

    C++拷贝构造与运算符

    在C++编程中,拷贝构造函数和赋值运算符(通常称为拷贝赋值运算符)是非常重要的概念,尤其是在涉及对象复制和管理资源的情况下。本文将详细介绍这两个概念,并通过一个具体的示例来深入探讨它们的工作原理。 #### ...

    C++中拷贝构造函数的总结详解

    C++中的拷贝构造函数是面向对象编程中的一个重要概念,它是构造函数的一种特殊形式,主要负责处理类对象的复制和初始化。拷贝构造函数的名字与类名相同,但接受一个同类型的常量引用作为参数,这个参数是即将被复制...

    基于c++中的默认拷贝函数的使用详解

    在C++中,每个类都拥有一个默认的拷贝构造函数,这是由编译器自动生成的,当类中没有显式定义拷贝构造函数时。拷贝构造函数是一种特殊的构造函数,它用于创建一个新对象作为现有对象的副本。默认拷贝构造函数执行...

    C++类和对象日期类练习源码

    在C++编程语言中,类和对象是面向对象编程的核心概念。这个“C++类和对象日期类练习源码”提供了实践这些概念的机会,特别是关注类的六个默认成员函数。让我们详细探讨一下这些知识点。 首先,类是C++中定义数据...

    c++课件\钱能C++程序设计教程(第二版)课件\9 对象的生灭.ppt

    在C++编程语言中,对象的生命周期包括创建(构造)和销毁(析构)两个主要阶段。本课件“对象的生灭”深入探讨了这些关键概念,它们是理解和编写高效、安全C++代码的基础。 1. **构造函数设计** 构造函数是用于...

    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++对象模型-322

    在C++编程语言中,对象模型是理解和设计高效代码的关键概念。...这些章节深入讨论了C++对象模型的关键方面,涵盖了类的构造和数据管理,以及成员函数的使用。理解这些概念对于编写高效、健壮的C++代码至关重要。

    C++类和对象期末重点.doc

    C++ 中的类和对象是面向对象编程的基础概念。类是一种用户定义的数据类型,封装了数据和操作这些数据的函数。对象是类的实例,拥有类所定义的所有特征。 类和对象的定义 ---------------- 类的定义使用关键字 ...

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

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

Global site tag (gtag.js) - Google Analytics