【问题标题】:Do member variables have external linkage?成员变量是否有外部链接?
【发布时间】:2017-09-07 19:07:54
【问题描述】:

我已经阅读了this,上面写着

类的名称、它们的成员函数、静态数据成员(const 与否),嵌套类和枚举,函数优先 在类体内引入友元声明

默认情况下具有外部链接。但是在类体内声明的未指定为静态的变量呢?此外,它以

开头

在命名空间范围内声明的以下任何名称都具有外部 联动

,但是类范围是否被视为命名空间范围?我的意思是类作用域和命名空间作用域是不同的,那么为什么他们一开始就说以下内容适用于命名空间作用域内提到的声明呢?我的意思是,例如,成员函数是在类范围内声明的,并且它们会像在命名空间范围内一样提及它们?

【问题讨论】:

  • 变量永远不会有链接。只有 names 有链接。 (因为链接描述了两个相似的名称如何相互关联。)
  • @KerrekSB 好吧,那么我认为我的意思是名称而不是变量。更具体地说,“成员变量的名称”
  • 成员变量用于引用类内的对象。他们不需要“联系”。他们的名字转化为类实例的偏移量。
  • 类方法确实有链接。类名是范围,但不是命名空间。
  • 类方法具有链接,因为您需要能够在调用方法时调用函数。该方法可能在其他翻译单元或库中定义,因此需要链接才能找到表示该方法的实际函数。当你引用一个成员变量时,类声明必须在视图中(否则该类将是一个不完整的类型),因此编译器知道偏移量。

标签: c++


【解决方案1】:

以下示例:

class C
{
public:
    int n;
};

C e;
namespace { C i; }

e 有外部链接,i 内部链接。现在谈论n的联系有多大意义?如果有的话,您可以考虑n 继承包含对象的链接,因此e.n 将具有外部链接,i.n 内部链接仅用于更好地理解,我不认为这是正确的措辞...

【讨论】:

  • 好的,我们快到了.. 但是“C”这个名字呢?这是否有外部联系,因此也有“n”?那么成员函数呢?它们也只是偏移量吗?
  • @overso 正如您引用的文章所说,除非在匿名命名空间中定义,否则名称 C 具有外部链接。 n 单独站立不能被单独提及(没有周围的对象)。因此,在这种情况下谈论链接没有多大意义。但是,成员函数是不同的:尽管您只能在对象上调用它们,但它们仍然每个类只存在一次,并且即使没有创建任何类的实例也存在。显而易见,您可以将成员函数分配给适当的成员函数指针,而无需涉及任何对象实例!
  • 哦,谢谢!但是,除非在匿名命名空间中定义,否则类名具有外部链接。但这也适用于成员函数吗?并且它们将始终与类名声明在同一位置,这是否意味着成员函数名将始终与类名具有相同的链接?此外,cppreference 还提到了类名和成员函数名,例如是否可以在类名之外的其他地方声明成员函数..
  • 好吧,当然它也适用于成员函数:"类的名称,它们的成员函数,[...]" 类和成员函数的处理方式相同.. . 然后在介绍中:“除非命名空间未命名或包含在未命名的命名空间中” 想一想:如果类定义在匿名命名空间中,则成员函数也是如此(或者您是否曾经设法在类之外声明一个成员函数???)。幸运的是(在这种情况下),我们没有像 C# 中那样的扩展函数,这会使事情复杂化很多......
  • 换句话说:类的成员函数总是与类本身具有相同的链接......
【解决方案2】:

引用标准:

如果一个名称可能表示与另一个范围内的声明引入的名称相同的对象、引用、函数、类型、模板、命名空间或值,则称该名称具有链接

翻译成简单的英语:

如果你可以在另一个范围内重新声明它,它就有链接。否则,不行。

您不能在另一个范围内重新声明非静态类数据成员,因此它没有链接。

【讨论】:

    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多