2013-06-11 53 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 *和其他所有東西。 –