C ++函数中定义的类变量的范围

时间:2013-08-12 09:22:30

标签: c++ variables scope

考虑以下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”的范围仅限于该函数? (因为它是在不使用新关键字的情况下定义的)

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

  3. 致谢:代码来自:http://www.cplusplus.com/doc/tutorial/inheritance/

2 个答案:

答案 0 :(得分:1)

  1. 是的,它是一个局部变量。
  2. 如果您返回rectres
  3. 的副本

答案 1 :(得分:1)

关于1&amp;的问题帕特里克已经对2进行了充分的回答,但我认为我可以扩展一下:

返回结构或类对象时,MOST编译器的工作方式[1]是调用函数传递一个指针参数(在视图中隐藏)以获取“return here”值。因此被调用的函数会将结果复制到调用代码提供的位置 - 实际的副本由类的复制构造函数完成。

注意1:C ++标准没有说明编译器应该如何做到这一点,如果编译器可以产生神奇的代码,只使用星球大战中的“力量”来移动位,那么根据标准。