【问题标题】:C++: friend as main in classC ++:朋友作为班级的主要成员
【发布时间】:2013-06-07 14:03:38
【问题描述】:

C++ 中的 main 函数可以成为友元函数吗?

 #include "stdafx.h"
#include <iostream>
using namespace std;
class A {
public:
    A():i(10){}
private:
    int i;
    friend int main();
};

int main()
{
    A obj;
    cout<<obj.i;
    return 0;
}

【问题讨论】:

  • 好的,现在有什么问题?语言语法?
  • 它是如何工作的? friend 允许函数 int main() 访问类 A 的私有变量和函数。 A 的构造函数将 i 设置为 10 int main() 访问 i(因为它是“朋友”并且可以访问私有变量 i)并 couts 它.

标签: c++ class constructor friend


【解决方案1】:

标准的 3.6.1(措辞来自草案 n3936,但在 C++03 中是相同的)说:

函数main不得在程序中使用。

这条规则的确切含义尚不清楚。该标准正式定义了相关术语 odr-used 的语义,而不仅仅是 used

为了安全起见,假设这条规则意味着“函数main 不应在friend 声明中命名。”


有趣的是,虽然这条规则的措辞与 C++03 相同,但在那个版本中,我们现在所知道的 odr-used 还没有被重命名,这条规则显然是指到那个概念。我想知道在从 used 重命名为 odr-used 的过程中是否忽略了这一点。如果此处有意不使用新术语,则该决定的基本原理可能会阐明哪些用途,确切地说,是要被禁止的。


Shafik found 表示重命名发生在 N3214 中,并且故意不将这条规则更改为 odr-use,尽管它没有解释原因。

【讨论】:

  • A friend 声明虽然不使用标识符
  • @MattMcNabb:是的,但标准语言禁止所有使用,而不仅仅是 odr 使用。
  • 好的,我以为您在推测这可能是一个缺陷,他们打算将其更改为 odr-used 以及其他所有内容。
  • @MattMcNabb:好的。是的,我在推测。该规则过去的意思是 odr-used,其名称为 used,但现在不再如此。没有澄清。我很想知道将 used 更改为 odr-used 的提案中是否讨论了此规则。
【解决方案2】:

C++中main函数可以变成友元吗?

是的,可以。

您的类A 中的friend 声明授予函数main() 访问其非公共数据成员名称(在本例中为i)的权利:

friend int main();

对象obj是默认构造的,A的构造函数将i的值设置为10

A() : i(10) {}
//  ^^^^^^^
//  Initializes i to 10 during construction

然后,值obj.i被插入到标准输出中:

cout << obj.i;
//      ^^^^^
//      Would result in a compiler error without the friend declaration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多