C++ 友元

友元分友元函数、友元类。

友元函数:一个类的友元函数可以访问该类的私有成员

我们可以将一个类的成员函数(包括构造、析构函数)作为另一个类的友元函数。如下

class CCar; // 提前声明CCar 类,以便后面的CDriver类使用
class CDriver {
public:
    void ModifyCar(CCar *pCar); // 改装汽车
};

class CCar {
private:
    int price;

    friend int MostExpensiveCar(CCar cars[], int total); // 声明为友元
    friend void CDriver::ModifyCar(CCar *pCar); // 声明友元
};

void CDriver::ModifyCar(CCar *pCar)
{
    pCar->price += 1000;
}

int MostExpensiveCar(CCar cars[], int total)
{
    int tmpMax = -1;

    for (int i = 0; i < total; ++i)
    {
        if (cars[i].price > tmpMax)
        {
            tmpMax = cars[i].price;
        }
    }

    return tmpMax;
}

int main()
{
    return 0;
}

友元类

A是B的友元类,则A的成员函数可以访问B的私有成员。

注意:友元类之间的关系不能传递,不能继承。

如下代码

class CCar {
private:
    int price;

    friend class CDriver; // 声明CDriver 为友元类
};

class CDriver {
public:
    CCar myCar;

    void ModifyCar() { // 改装汽车
        myCar.price += 1000;
    }
};

int main() {return 0;}
时间: 2024-12-28 18:28:43

C++ 友元的相关文章

模板类的友元重载

模板类的友元重载和普通类的友元重载有不同之处,可以参考这篇CSDN博客http://blog.csdn.net/ozwarld/article/details/7770808 #include <iostream> using namespace std; template <class T> class Test; // 模板类前置声明 template<class T> ostream& operator << (ostream& out

c++类模板之间友元函数调用

1 #include <stdio.h> 2 #include <iostream> 3 4 using namespace std; 5 6 template<typename T> class BTree; 7 8 /***************************节点类模板*********************************/ 9 template<typename T> 10 class BTreeNode{ 11 friend

C++ 友元函数总结

1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单.清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数. 2.什么时候使用友元函数: 1)运算符重载的某些场合需要使用友元. 2)两个类要共享数据的时候 3.怎么使用友元函数: 友元函数的参数: 因为友元函数没有this指针,则

c++的友元类、方法及其益处

在java中,我们知道除了public和private,protected外,还有默认的包可见性访问级别,虽然如此,很多时候出于早期设计缺陷的原因,我们需要访问一些包或者protected可见性级别的方法,这个时候就比较麻烦了,要是选择和目标服务在相同包中,总看起来很奇怪,如果作为子类继承,则更加奇怪.但是我们又不想把该接口服务的可见性声明为public. c++中,这一点做的就比较好,我们知道在c++中,有友元类.方法的特性,该特性相当于白名单的作用,当一个类或者成员函数.非OO函数被声明为目

c++ 中的友元函数的普通用法

C++中友元函数的调用,一般分为三种方式: 1.一般的友元函数 2.类A作为类B的友元类,则类A的成员函数都是类B的友元函数. 3.一个类的成员函数作为另外一个类的友元函数 //分为友元函数的例子 类A 作为测试的类,类B 是类A的友元类.class A{public: A() {  a = 100;  b = 10; } friend class B; //这儿公私均可,常常用到的是变为私有变量,类B是类A的友元类.友元的第二种方式,需要带class int getA() {  return

C++友元函数

1. 1 #include <iostream> 2 using namespace std; 3 4 class Time{ 5 friend void func(Time &t); // 声明全局函数为一个友元函数 6 public: 7 Time(int h, int m, int s) : i_mHour(h), i_mMin(m), i_mSecon(s) { } // 构造函数 8 private: 9 int i_mHour; 10 int i_mMin; 11 int

模板类的约束模板友元函数:template friend functions

本来这篇博客是不打算写的,内容不是很难,对于我自己来讲,更多的是为了突出细节. 所谓template friend functions,就是使友元函数本身成为模板.基本步骤:1,在类定义的前面声明每个模板函数.eg:template <typename T> void counts(); template <typename T> void report<>(T &);2,在类声明中再次将模板声明为友元. template <typename TT>

C++ 类模板二(类模版与友元函数)

//类模版与友元函数 #include<iostream> using namespace std; template<typename T> class Complex{ public: Complex(T a,T b); void Print() const//const修饰的是this指针 { cout << this->Real << ":" <<this->Image<< endl; } /*

4 C++基础4 类 const函数 转全局函数 返回*this 数组类。友元 函数 类 操作符重载

1,请问类中函数 const修饰的谁? [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> using namespace std; class A { public: //const的三种写法 //const void fun(int a,int b) //void const fun(int a,int b) //void fun(int a,int b) const vo

函数模板友元

;函数模板友元 (即一个类友元的是一个全局函数模板而不是原先的全局函数,需注意类模板传入的类型) 标准带类模板参数 friend void fun1(A<T>& obj); 指定这个A<T>类型的模板有一个这样的朋友函数,那么也就意味着这个函数内部只能由A<T>类型的模板 实例化的类 实例化出来的对象可以访问这个对象的数据成员,不是这个类型的类模板就不能访问 ;code template<typename T> class A{ public: A(