2013-06-11 54 views
-3

C++中主要函数可以成为朋友函数吗?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; 
} 
+1

好的,现在有什么问题?语言语法? –

+0

它是如何工作的? friend允许函数int main()访问A的私有变量和函数.A的构造函数将i设置为10 int main()访问我(因为它是一个“朋友”并且可以访问私有变量i) 。 – Daboyzuk

回答

4

主要功能能成为朋友函数C++?

是的,它可以。

friend声明在类A补助功能main()访问其非公开数据成员的名称(,i在这种情况下)的权利:

friend int main(); 

对象obj是缺省构造的,和的A构造函数设置的i10值:

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

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

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

标准的3.6.1(措词n3936草案,但它是在同一个C++ 03)说:

功能main应不能在程序中使用。

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

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


有趣的是,虽然这条规则的措辞是相同的C++ 03,在该版本中,我们现在知道作为ODR使用的尚未改名,这条规则显然是指那个概念。我想知道这是否被忽视在重命名使用odr-used。如果新的术语在这里没有被有意使用,那么这个决定的基本原理可能会说明准确地禁止使用什么。


Shafik found的重命名发生在N3214,这条规则是不故意改为ODR使用,虽然它并没有解释为什么。

+0

“friend”声明不会使用标识符,但 –

+0

@MattMcNabb:正确,但标准语言禁止所有使用,而不仅仅是使用odr。 –

+0

好吧,我以为你在猜测这可能是一个缺陷,他们打算把它改成* odr-used *和其他所有东西。 –