C++友元

简介:

类的提前声明

回忆函数的原型声明

#include <iostream>
using std::cout;
using std::endl;
void test();
int main()
{
    test();
    return 0;
}
void  test()
{  
    cout << "函数的提前声明!" << endl; 
}

类和函数也是类似的,有时也需要提前声明

class B;    //提前声明
class A
{   //class B
};
int main()
{  
    void ff(B &);   //RIGHT可以声明引用
    B *p_b = NULL; //RIGHT可以定义指针!

    //B bb; //ERROR不能定义对象
    system("PAUSE");
    return 0;
}
class B
{ };
void ff(B &)
{}

注意:

提前声明不能定义该类的对象

仅能定义该类的指针或引用

为何引入友元?

通常一个类中的非公有成员是无法被该类的非成员函数直接访问的!如果我们将函数声明为这个类的友元,该函数将能访问该类的非公有成员!

友元非成员函数

概念:将类外的函数(顶层函数)声明为友元函数

声明方法:

friend 类型 函数名(形参表);   

在类中用friend声明函数!

#include <iostream>
#include <string>
using namespace std;

class Time
{
public:
    Time(int aH=0, int aM=0, int aS=0);
    friend void display(Time&);
private:
    int hour;
    int minute;
    int second;
};
Time::Time(int aH, int aM, int aS)
{
    hour=aH;
    minute=aM;
    second=aS;
}
void display(Time &t)
{
    cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
}
int main()
{
    Time t(12,30,54);
    display(t);
    system("PAUSE");
    return 0;
}

注意:

①友元函数应该声明在类体内,且friend仅在声明时使用,只出现一次。

②调用方式和普通全局函数一样。

③友元全局函数的声明语句就是函数的声明语句。

④友元全局函数也可以在类内定义,此时编译环境仍将其视为全局函数,且定义就相当于声明而不需要提前声明。

⑤一个全局函数可以被声明为多个类的友元。

⑥多个全局函数可以被声明为一个类的友元。

友元成员函数

概念:一个类的成员函数可以被声明为另一个类的友元。

声明方法:

friend 类型 类名::函数名(形参表);   

#include <iostream>
#include <string>
using namespace std;

class Atest;  //提前声明
class Btest
{
public:
    Btest(int aX = 4):m_dVal(aX){}
    void display(Atest &aVal);
private:
    double m_dVal;
};
class Atest
{
public:
    Atest(int aX = 3):m_iVal(aX){}
    friend void Btest ::display(Atest &aVal);
private:
    int m_iVal;
};
void Btest::display(Atest &aVal)
{
    cout << "Atest.m_iVal = " 
        << aVal.m_iVal << endl;
    cout << "Btest.m_dVal = " 
        << m_dVal << endl;
}
int main( ) 
{ 
    Atest testa;
    Btest testb;
    testb.display(testa);
    getchar( );
    return 0; 
}

友元类

为什么引入友元类?

如果一个类A中的成员函数都希望访问类B的非公有成员,我们可以将A声明为B类的友元类

声明方法:

friend 类名;

class Date;
class Person
{
    friend Date;//在person类中的任意位置
};
class Date
{
};

注意:

①友元不具备传递性!

②友元关系单向的!

③友元关系破坏了信息隐蔽的原则,但友元关系也提供了数据共享的一种方法。

④友元不受访问限定符限制。

目录
相关文章
|
1月前
|
存储 编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(一)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
20 1
|
1月前
|
C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(二)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
编译器 C++
【C++】深入探索类和对象:初始化列表及其static成员与友元(三)
【C++】深入探索类和对象:初始化列表及其static成员与友元
|
1月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
21 0
|
2月前
|
编译器 数据安全/隐私保护 C++
C++(十四) friend友元
友元机制允许非成员函数或类访问私有成员,提高程序效率,但会破坏封装性。友元可以是函数或类,并以关键字`friend`声明。友元函数不是成员函数,需通过对象访问私有成员。友元类使所有成员函数可访问另一个类的私有成员,常用于简化开发。友元声明位置灵活,但不影响访问控制。使用友元需注意其单向性和非传递性。
|
4月前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
|
4月前
|
编译器 数据安全/隐私保护 C++
C++一分钟之-属性友元与访问控制
【7月更文挑战第9天】C++中的友元机制允许非成员函数或类访问私有和保护成员,打破了封装性。友元需在类内声明,常见的错误包括忘记声明、过度使用及误解友元的非继承性。要避免错误,应明确声明友元,限制其使用,并理解其局限。示例展示了如何声明和使用友元函数来访问私有数据。谨慎使用友元以保持代码的健壮性和可维护性。
46 1
|
4月前
|
编译器 C++
【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)
📚 C++ 知识点概览:探索类的`static`成员、友元及应用🔍。