Skip to content

Latest commit

 

History

History
42 lines (36 loc) · 2.2 KB

File metadata and controls

42 lines (36 loc) · 2.2 KB

C++友元函数和友元类

  • 场景
    • 在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。
  • 利弊
    • 友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
  • 友元函数
    • 在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。

    • 将全局函数声明为友元的写法如下:

        friend  返回值类型  函数名(参数表);
      
    • 将其他类的成员函数声明为友元的写法如下:

        friend  返回值类型  其他类的类名::成员函数名(参数表);
      
    • 但是,不能把其他类的私有成员函数声明为友元。

  • 友元类
    • 一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。在类定义中声明友元类的写法如下:

        friend  class  类名;
      
    • 示例

        class CCar
        {
        private:
            int price;
            friend class CDriver;  //声明 CDriver 为友元类
        };
        class CDriver
        {
        public:
            CCar myCar;
            void ModifyCar()  //改装汽车
            {
                myCar.price += 1000;  //因CDriver是CCar的友元类,故此处可以访问其私有成员
            }
        };
        int main()
        {
            return 0;
        }
      
    • 友元关系在类之间不能传递,即类 A 是类 B 的友元,类 B 是类 C 的友元,并不能导出类 A 是类 C 的友元。