English 中文(简体)
地方变量范围问题
原标题:Local variable scope question
  • 时间:2009-09-07 10:37:11
  •  标签:

为什么以下编码印刷“xxY”? 是否有地方变量属于整个功能的范围? Can 我使用这种行为,或在今后的C++标准中加以改变?

我认为,根据C++标准3.2“A名称在一栏被宣布为当地人。 其潜在范围始于声明点,并在声明区域结束时结束。

#include <iostream>
using namespace std;

class MyClass
{
public:
  MyClass( int ) { cout << "x" << endl; };
  ~MyClass() { cout << "x" << endl; };
};

int main(int argc,char* argv[])
{
  MyClass  (12345);
// changing it to the following will change the behavior
//MyClass m(12345);
  cout << "Y" << endl;

  return 0;
}

根据答复,我可以假定,<代码>MyClass(12345);是表述(和范围)。 这是有意义的。 因此,我预计以下法典将永远印刷“xYx”:

MyClass (12345), cout << "Y" << endl;

并且允许替换:

// this much strings with explicit scope
{
  boost::scoped_lock lock(my_mutex);
  int x = some_func(); // should be protected in multi-threaded program
} 
// mutex released here

//    

// I can replace with the following one string:
int x = boost::scoped_lock (my_mutex), some_func(); // still multi-thread safe
// mutex released here
最佳回答

你正确地引用了标准。 我要强调:

<<>><>>> ><>>>>>><>>>>>> 栏目中的“<>/>>>指该栏块的地方。 其潜在范围始于声明点,并在声明区域结束时结束。

您实际上宣布了<>号>。 页: 1

MyClass (12345);

<does not Even contained a declaration! 它包含的是一种表达方式,它创立了MyClass的榜样,赞扬了这一表述(不过,就这一特定情况而言,没有什么东西可以加以计算),并将其结果投到“避免<>条/代码”的标签上,并销毁了在那里制造的物体。

不太令人混淆的一件事就好了。

call_a_function(MyClass(12345));

你们多次看到这段话,知道它是如何运作的,没有你们?

问题回答

您提出的反对

MyClass(12345);

a. 只是活着的一个暂时物体in that expression;

MyClass m(12345);

它是整个街区活着的物体。

你在实际上制造物体时不将其保留在范围,因此在制造后被销毁。 因此,你所经历的行为。

你们可以不接触所制造的物体,这样,汇编者会把它放在一起?

回答你的其他问题。 下面是 com经营者的聘用。 它创立了一个<代码>MyClass临时,包括打电话给建筑商。 然后评价第二个表述:<代码>cout << “Y” << endl,其中将打印出Y。 届时,在全部表达之后,它将销毁临时人员,将其称为解放者。 因此,你们的期望是正确的。

MyClass (12345), cout << "Y" << endl;

为了开展以下工作,你应当添加括号,因为 com在申报中具有预先界定的含义。 它将开始宣布一项职能<代码>s_func,退回<代码>int,不计任何参数,并将指定<代码> 范围_lock<>/code>。 反对<代码>x。 采用括号,你说,整件是单一 com操作器的表述。

int x = (boost::scoped_lock (my_mutex), some_func()); // still multi-thread safe

应当指出,以下两条内容相同。 第一种是not,作为构造理由,使用<条码>my_mutex制造了一个无名的临时物体,但围绕名称的括号是多余的。 不要让 s子混淆你。

boost::scoped_lock(my_mutex);
boost::scoped_lock my_mutex;

我看到术语范围和寿命被滥用。





相关问题
热门标签