1. 首页
  2. 编程语言
  3. C++ 
  4. 拷贝构造函数-learning ros for robotics programming - second edition

拷贝构造函数-learning ros for robotics programming - second edition

上传者: 2024-07-23 22:29:16上传 PDF文件 14.32MB 热度 8次

10.3 拷贝构造函数介绍了 C++ 中的引用的基本概念后,我们将讲述一个更令人混淆的概念:拷贝构造函数,它常被称为 X ( X & )(“X 引用的 X”)。在函数调用时,这个构造函数是控制通过传值方式传递和返回用户定义类型的根本所在。

10.3.1 传值方式传递和返回

为了理解拷贝构造函数的需要,我们来看一下 C 语言在调用函数时处理通过传值方式传递和返回变量的方法。

int f (int x, char c);

int g = f (a, b);

编译器如何知道怎样传递和返回这些变量?其实它天生就知道!因为它必须处理的类型范围是如此之小(char, int, float, double 和它们的变量),这些信息都被内置在编译器中。如果能了解编译器怎样产生汇编代码和怎样确定调用函数 f() 产生语句的,我们就能得到下面的等价物:

push b

push a

call f()

add sp, 4

mov g, register a

这个代码已被认真整理过,使之具有普遍意义—b 和 a 的表达式根据变量是全局变量(在这种情况下它们是 _b 和 _a)或局部变量(编译器将在堆栈指针上对其索引)将有差异。g 表达式也是这样。对 f() 调用的形式取决于我们的 name-mangling 方案,“寄存器 a”取决于 CPU 寄存器在我们的汇编程序中是如何命名的。但不管代码如何,逻辑是相同的。在 C 和 C++ 中,参数是从右向左进栈,然后调用函数,调用代码负责清理栈中的参数(这一点说明了 add sp, 4 的作用)。但是要注意,通过传值方式传递参数时,编译器简单地将参数拷贝压栈—编译器知道拷贝有多大,并知道为压栈的参数产生正确的拷贝。f() 的返回值放在寄存器中。编译器同样知道返回值的类型,因为这个类型是内置于语言中的,于是编译器可以通过把返回值放在寄存器中返回它。拷贝这个值的比特位等同于拷贝对象。

  1. 传递和返回大对象

现在来考虑用户定义的类型。如果创建了一个类,我们希望传递该类的一个对象,编译器怎么知道做什么?这是编译器的作者所不知的非内部数据类型,是别人创建的类型。为了研究这个问题,我们首先从一个简单的结构开始,这个结构太大以至于不能在寄存器中返回。更多详细内容可以参考以下链接:C++ 构造函数赋值函数拷贝构造函数C++ 拷贝构造函数赋值构造函数拷贝构造函数的使用

下载地址
用户评论