友元类声明和成员函数声明

时间:2018-03-21 17:29:52

标签: c++

为什么朋友类不需要转发声明但成员函数需要?

朋友班:

class String0{     
friend class String;
private:
    int size = 0;
    string s;
};

class String {      
public:
    string combine(const string &s1);
private:
    int size = 0;
    string s;
};   

会员朋友:

class String {        
public:
    string combine(const string &s1);  //why need this?
private:
    int size = 0;
    string s;
};

class String0 {
friend string String::combine(const string &);
};

String String::combine(const string &s1){...}

在使用类和非成员函数之前,不需要声明它们 在朋友的声明中。 但为什么会员功能需要?

2 个答案:

答案 0 :(得分:2)

友元类/函数声明本身就是一个声明,并且向前声明了类/函数。你说对了。

现在,如果您可以在class A中将friend的成员函数声明为class B,则表示您正在更改class A的界面。

想象一下我做了

class foo {
public:
    friend void std::vector<int>::fun();
};

我是否向std::vector<int>添加了一个功能?

答案 1 :(得分:1)

标准给出了一个例子:

  

13.3朋友 [class.friend] 3 /

class C;
typedef C Ct;

class X1 {
  friend C; // OK: class C is a friend
};

class X2 {    
  friend Ct;      // OK: class C is a friend
  friend D;       // error: no type-name D in scope
  friend class D; // OK: elaborated-type-specifier declares new class
};

friend class D前锋声明class D并与之建立友情关系。