use*_*635 7 c++ visibility scope
我想我知道可以接受,但我不确定我是否非常清楚地了解能见度
例如:
class X
{
int x;
};
Run Code Online (Sandbox Code Playgroud)
这里,'x'只在课堂上可见,但在课堂外可以访问.如果我是正确的,有人可以在答案中解释关于如何不控制能见度等的文本.
(C++ 03/11.0)应该注意,它是对受控制的成员和基类的访问,而不是它们的可见性.成员的名称仍然可见,并且当这些成员和基类不可访问时,仍会考虑对基类的隐式转换.建立对给定构造的解释而不考虑访问控制.如果建立的解释使用了不可访问的成员名称或基类,则该构造是不正确的.
也许这个例子有助于:
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).这也是一个编译错误,但这次错误是该调用根本没有匹配功能.
C++有一些关于私有类成员名称可见性和可访问性的深奥功能.根据定义,私有类成员名称只能由类成员和朋友访问.然而,可见性规则可能会使许多人感到困惑.它们可以总结如下.
在今天的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++的范围规则.类成员可以同时显示和无法访问.
静态成员作为例子都可见通过您的应用程序的运行,但全球访问仅针对适用于他们的修改.