0

考虑以下 C++ 代码:

// friend functions
#include <iostream>
using namespace std;

class CRectangle {
  int width, height;
 public:
  void set_values (int, int);
  int area () {return (width * height);}
  friend CRectangle duplicate (CRectangle);
};

void CRectangle::set_values (int a, int b) {
 width = a;
 height = b;
}

CRectangle duplicate (CRectangle rectparam)
{
   CRectangle rectres; // Defined without using new keyword. This means scope of this variable of in this function, right ?
   rectres.width = rectparam.width*2;
   rectres.height = rectparam.height*2;
   return (rectres);
}

int main () {
  CRectangle rect, rectb;
  rect.set_values (2,3);
  rectb = duplicate (rect);
  cout << rectb.area();
  return 0;
}

变量“CRectangle rectres”在函数“CRectangle duplicate”中定义。

  1. 这是否意味着变量“CRectangle rectres”的范围仅限于函数?(因为它是在没有使用 new 关键字的情况下定义的)

  2. 如果上述问题的答案是肯定的,那么如何返回(因为它是局部变量)?

学分:代码取自:http ://www.cplusplus.com/doc/tutorial/inheritance/

4

2 回答 2

1

帕特里克已经充分回答了您关于 1 和 2 的问题,但我想我可以扩展一下:

当您返回一个结构或类对象时,大多数编译器的工作方式 [1] 是调用函数为“返回此处”值传入一个指针参数(从视图中隐藏)。所以被调用的函数会将结果复制到调用代码提供的位置——实际的复制是由类的复制构造函数完成的。

注意 1:C++ 标准没有说明编译器应该如何执行此操作,并且如果编译器可以生成仅通过使用《星球大战》中的“原力”移动位的神奇代码,那么根据标准也是允许的。

于 2013-08-12T10:02:19.600 回答
1
  1. 是的,它是一个局部变量。
  2. 如果您返回一份rectres
于 2013-08-12T09:25:44.303 回答