C++:具有相同名称的变量(操作顺序)(作用域)
C++: Variables with same name (order of operations) (Scope)
我正在修复 visual studio 警告 4456('pLine' 的本地声明隐藏了之前的声明),当我遇到如下代码时...
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 是否被声明然后立即使用?或者是 Operator=() 运行 with pLine1?
在
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
}
我正在修复 visual studio 警告 4456('pLine' 的本地声明隐藏了之前的声明),当我遇到如下代码时...
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 是否被声明然后立即使用?或者是 Operator=() 运行 with pLine1?
在
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
}