gpt4 book ai didi

c++ - 为什么我们可以在类范围之外定义私有(private)成员

转载 作者:太空宇宙 更新时间:2023-11-04 15:37:02 32 4
gpt4 key购买 nike

我认为私有(private)成员甚至不存在于类范围之外,所以我们无法访问它们。但是请考虑:

#include <iostream>

class A
{
private:
static const int a = 1;
};

const int A::a; //Access to the private member outside the class scope
//the compiler doesn't compain

int main ()
{
std::cout << A::a << std::endl; //compile-time error
}

为什么允许?是为了方便吗?

最佳答案

这是允许的,因为语言标准是这样说的。

借助private 等访问说明符实现的成员访问控制 概念与对成员定义施加限制完全无关。它是出于完全不同的目的而引入的。它旨在限制完全不同的上下文中的访问。语言规范不禁止在类外定义私有(private)成员。为什么会这样?

您将私有(private)成员描述为在类范围之外“甚至不存在”是完全错误的。语言标准实际上明确指出类的 protected 成员和私有(private)成员在类外部完全可见,甚至通过名称查找找到。仅在此之后检查访问限制。

例如在如下一段代码中

struct S {
void foo(long);
private:
void foo(int);
};

int main() {
S().foo(1);
}

编译器需要从外部查看私有(private) S::foo(int),通过重载解析选择它,然后才告诉您您正在尝试调用私有(private)函数。

关于c++ - 为什么我们可以在类范围之外定义私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30930227/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com