在C++中,阴影变量名称的范围分辨率("优先顺序")是多少?我似乎无法在网上找到简明的答案.
例如:
#include <iostream>
int shadowed = 1;
struct Foo
{
Foo() : shadowed(2) {}
void bar(int shadowed = 3)
{
std::cout << shadowed << std::endl;
// What does this output?
{
int shadowed = 4;
std::cout << shadowed << std::endl;
// What does this output?
}
}
int shadowed;
};
int main()
{
Foo().bar();
}
Run Code Online (Sandbox Code Playgroud)
我想不出变量可能会发生冲突的任何其他范围.如果我错过了,请告诉我.
shadow在bar成员函数内部时,所有四个变量的优先级顺序是多少?
通常,'using'声明用于将基本类的一些成员函数纳入范围,否则这些函数将被隐藏.从这个角度来看,它只是一种使可访问信息更便于使用的机制.
但是:'using'声明也可用于更改访问约束(不仅用于函数,还用于属性).例如:
class C{
public:
int a;
void g(){ cout << "C:g()\n"; }
C() : a(0){}
};
class D : public C{
private:
using C::a;
using C::g;
public:
D() { a = 1; }
};
int main(void){
D d;
cout << d.a << endl; //error: a is inaccessible
C *cp = &d;
cout << cp->a << endl; //works
d.g(); //error: g is inaccessible
cp->g(); //works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为派生类中的访问限制实际上没有用,因为你总是可以从指向基类的指针访问g()和a.那么至少应该有某种编译器警告吗?或者禁止衍生类的访问限制更好?使用声明不是添加约束以进行访问的唯一可能性.它也可以通过覆盖基类的函数并将其放在具有更多访问限制的部分中来完成.是否有一些合理的例子,以这种方式限制访问确实是不可取的?如果不是,我不明白为什么应该允许它.
还有一件事:至少使用g ++,相同的代码编译得很好而没有"使用"这个词.这意味着对于上面的例子:可以编写C :: a; 和C :: g; 而不是使用C :: a; 使用C …