C ++:具有相同名称的变量(操作顺序)(范围)

时间:2016-12-20 00:37:56

标签: c++ scope variable-declaration

当我遇到看起来像这样的代码时,我正在修复视觉工作室警告4456(当地声明&p; 39,隐藏以前的声明)...

CObject* pLine;
for(i)
{
  CObject* pLine = pLine = GetObjectPtr(i);
  list.Add(pLine)
}
pLine = GetObjectPtr(0);
DoStuff(pLine);

为了清楚起见,我将用1&标记它们。 2

CObject* pLine1 = NULL;
for(i)
{
  CObject* pLine2 = pLine? = GetObjectPtr(i);
  list.Add(pLine2)
}
pLine1 = GetObjectPtr(0);
DoStuff(pLine1);

我不需要知道如何修复此代码;由于在此循环之后下一次使用pLine是一个集合,因此可以安全地重命名pLine2或删除额外的声明。

我想知道的是,,,在这行代码

  CObject* pLine = pLine = GetObjectPtr(i);

哪个pLine是第二个pLine? pLine2是否被声明然后立即使用?或者是运算符=()与pLine1一起运行?

1 个答案:

答案 0 :(得分:1)

CObject* pLine = pLine = /*...*/;

(新)变量pLine=开始,并开始隐藏外部范围内的变量。

在某些极少数情况下使用自引用可能很有用(但由于对象尚未初始化,因此只能使用它的引用)。

void* p = &p;
SomeNode node(node, weight); // And use only &node in constructor.

检查行为可以

的代码
int i;
void* p = &i;
std::cout << &p << std::endl; // value #1
std::cout << p << std::endl;  // value #2
std::cout << &i << std::endl; // value #2
{
    void* p = &p;
    std::cout << &p << std::endl; // value #3
    std::cout << p << std::endl;  // value #3
}

Demo