C ++:朋友作为课堂上的主要人物

时间:2013-06-11 16:13:20

标签: c++ class constructor friend

主要功能可以在C ++中成为好友功能吗?

 #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;
}

2 个答案:

答案 0 :(得分:5)

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

  

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

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

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


有趣的是,尽管此规则的措辞与C ++ 03相同,但在该版本中,我们现在所知的 odr-used 尚未重命名,而且这条规则明确指出这个概念。我想知道从使用 odr-used 重命名时是否忽略了这一点。如果在这里故意不使用新术语,那么该决定的理由可能会阐明禁止使用的确切用途。


Shafik found重命名发生在N3214中,并且此规则有意未更改为 odr-use ,但它没有解释原因。

答案 1 :(得分:4)

  

主要功能可以在C ++中成为好友功能吗?

是的,它可以。

您的班级friend中的A声明授予函数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