Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类与类成员的联系_C++_Object_Header Files_Linkage - Fatal编程技术网

C++ 类与类成员的联系

C++ 类与类成员的联系,c++,object,header-files,linkage,C++,Object,Header Files,Linkage,以下是我知道的外部和内部链接的定义 具有内部链接:可在翻译单元内使用 具有外部链接:存在于特定翻译单元之外,可通过整个程序访问 以下是一个例子: 假设我有一个名为a.h的头文件,我在其中声明类成员和成员方法(构造函数、析构函数…)。在名为a.cpp的cpp文件中,我定义了这些方法 在包含头文件的main.cpp文件中,我使用类a的构造函数创建了类型a的对象a 现在假设我将A的类成员声明为private或protected,我无法通过main.cpp文件访问它们。如果我宣布它们是公开的,我可以 这

以下是我知道的外部和内部链接的定义

具有内部链接:可在翻译单元内使用

具有外部链接:存在于特定翻译单元之外,可通过整个程序访问

以下是一个例子:

假设我有一个名为a.h的头文件,我在其中声明类成员和成员方法(构造函数、析构函数…)。在名为a.cpp的cpp文件中,我定义了这些方法

在包含头文件的main.cpp文件中,我使用类a的构造函数创建了类型a的对象a

现在假设我将A的类成员声明为private或protected,我无法通过main.cpp文件访问它们。如果我宣布它们是公开的,我可以

这里是我的问题:当我将A的类成员声明为私有或受保护时,说它们具有内部链接有意义吗

我对链接实际上代表什么感到非常困惑,当谈论内部或外部链接是可能的时候

现在假设我将A的类成员声明为private或protected,我无法通过main.cpp文件访问它们

是的,你可以。只需从
A.cpp
中选取其中一个定义,然后将它们移动到
main.cpp
。该定义将能够访问
A
的私有成员。这是完全合法和有效的C++。 访问控制(public/private/etc)确定哪些代码可以命名该类的成员。它们不控制这些成员的定义位置。也就是说,访问控制可以根据这些名称出现的代码的特定上下文而不是名称出现的文件来隐藏名称

链接(部分)控制名称在整个程序中相对于声明/定义该名称的特定翻译单元(又名:源文件)的可见性。链接非常关心名称出现在哪个文件中,相对于该名称的声明/定义位置

也就是说,类型的成员根本没有链接。您可以认为它们具有与类型本身相同的链接。链接适用于命名空间/全局范围的声明和定义,而不适用于类成员

现在假设我将A的类成员声明为private或protected,我无法通过main.cpp文件访问它们

是的,你可以。只需从
A.cpp
中选取其中一个定义,然后将它们移动到
main.cpp
。该定义将能够访问
A
的私有成员。这是完全合法和有效的C++。 访问控制(public/private/etc)确定哪些代码可以命名该类的成员。它们不控制这些成员的定义位置。也就是说,访问控制可以根据这些名称出现的代码的特定上下文而不是名称出现的文件来隐藏名称

链接(部分)控制名称在整个程序中相对于声明/定义该名称的特定翻译单元(又名:源文件)的可见性。链接非常关心名称出现在哪个文件中,相对于该名称的声明/定义位置


也就是说,类型的成员根本没有链接。您可以认为它们具有与类型本身相同的链接。链接适用于命名空间/全局作用域的声明和定义,而不适用于类成员。

这可能会有所帮助:,@nicolas
class A{protected:int name;}名称是我所说的属性。这可能会有帮助:,@nicolas
class A{protected:int-name;}名称就是我所说的属性。