相关疑难解决方法(0)

在C++中,阴影变量名称的范围分辨率("优先顺序")是多少?

在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)

我想不出变量可能会发生冲突的任何其他范围.如果我错过了,请告诉我.

shadowbar成员函数内部时,所有四个变量的优先级顺序是多少?

c++ variables scope scope-resolution shadowing

16
推荐指数
2
解决办法
2611
查看次数

c ++使用声明,范围和访问控制

通常,'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 …

c++ scope access-control using-declaration

11
推荐指数
1
解决办法
1万
查看次数