班级成员的可见度?

use*_*635 7 c++ visibility scope

我想我知道可以接受,但我不确定我是否非常清楚地了解能见度

例如:

class X
{
   int x;
};
Run Code Online (Sandbox Code Playgroud)

这里,'x'只在课堂上可见,但在课堂外可以访问.如果我是正确的,有人可以在答案中解释关于如何不控制能见度等的文本.

(C++ 03/11.0)应该注意,它是对受控制的成员和基类的访问,而不是它们的可见性.成员的名称仍然可见,并且当这些成员和基类不可访问时,仍会考虑对基类的隐式转换.建立对给定构造的解释而不考虑访问控制.如果建立的解释使用了不可访问的成员名称或基类,则该构造是不正确的.

Ker*_* SB 7

也许这个例子有助于:

class Bob
{
private:
    int foo(int, int);
};

class David : Bob
{
    void goo() {
        int a = foo(1, 2);  // #1
    }
};

class Dani : Bob
{
     void foo();
     void goo() {
         int a = foo(1, 2); // #2
     }   
};
Run Code Online (Sandbox Code Playgroud)

在第1行,名称foo可见的,但它所指定的功能是不可访问的(由于是私有的Bob).这是一个编译错误,但编译器知道有一个潜在的函数Bob::foo可以匹配,但是不可访问.

上线#2,名字foo只是指Dani::foo,虽然Bob::foo不可见的(因为它是隐藏的),所以根本就呼叫没有匹配功能foo(1, 2).这也是一个编译错误,但这次错误是该调用根本没有匹配功能.


Lio*_*ion 7

C++有一些关于私有类成员名称可见性和可访问性的深奥功能.根据定义,私有类成员名称只能由类成员和朋友访问.然而,可见性规则可能会使许多人感到困惑.它们可以总结如下.

  1. 私人会员的名字仅供其他会员和朋友使用.
  2. 查看类定义的所有代码都可以看到私有成员.这意味着必须声明其参数类型,即使在此翻译单元中永远不需要它们...
  3. 在可访问性检查之前发生重载解析.

在今天的C++("C++ 03"和更早版本的变体)中,可访问性和可见性的概念是独立的.类和命名空间的成员只要在"范围内"就可以看到,并且没有机制可以从声明的角度降低这种可见性.可访问性只是类成员的参数,并且与可见性概念正交.后一种观察对于新手C++程序员来说经常是令人惊讶的.见PDF.

请考虑以下示例.

#include < complex>

class Calc 
{ 
    public: 
        double Twice( double d ); 
    private: 
        int Twice( int i ); 
        std::complex Twice( std::complex c ); 
};

int main() 
{ 
    Calc c; 
    return c.Twice( 21 ); // error, Twice is inaccessible 
}    
Run Code Online (Sandbox Code Playgroud)

当编译器必须解析对函数的调用时,它按顺序执行三个主要操作:

  • 在执行任何其他操作之前,编译器会搜索至少包含一个名为Twice的实体的范围,并生成候选列表.在这种情况下,名称查找首先查看Calc的范围,以查看是否至少有一个名为Twice的函数; 如果没有,则将依次考虑基类和封闭的命名空间,一次一个,直到找到至少有一个候选的范围.但是,在这种情况下,编译器查看的第一个作用域已经有一个名为Twice的实体 - 实际上,它有三个,因此三重奏成为候选集.(有关在C++中进行名称查找的更多信息,请讨论它如何影响您应该打包类及其接口的方式

  • 接下来,编译器执行重载决策以从候选列表中选择唯一的最佳匹配.在这种情况下,参数是21,它是一个int,可用的重载采用double,int和complex.显然,int参数是int参数的最佳匹配(它是完全匹配,不需要转换),因此选择了Twice(int).

  • 最后,编译器执行可访问性检查以确定是否可以调用所选函数.

请注意,可访问性(由C++中的修饰符定义)和可见性是独立的.可见性基于C++的范围规则.类成员可以同时显示无法访问.

静态成员作为例子都可见通过您的应用程序的运行,但全球访问仅针对适用于他们的修改.