友元
私有成员只有在类的成员函数内部被访问到。一个类的友元函数可以访问该类的私有成员。
友元函数也可以为全局函数。
可以将一个类的成员函数(包括构造、析构函数)声明成另一个类的友元函数。但是,必须先定义包含成员函数的类,才能将成员函数设为友元。友元类也一样,要先定义后声明为友元类。
友元类
B是A的友元类,那么B的成员函数可以通过对象名访问A的私有成员。注意:友元类之间的关系不能传递,不能继承。也就是说基类有友类函数和友元类,它们能访问基类任何成员,而不能访问由这个基类继承的派生类的任何成员。
友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。在A类的类体中用以下语句声明B类为其友元类:
friend B;
在实际开发中除非确有必要,一般不把一个类声明为另一个类的友元类,这样更加安全。
代码如下:
#include <iostream> using namespace std; class Engine; class tyer { private: int width, length; public: tyer(int w, int l) :width(w), length(l) { cout << "tyer constructor is called" << endl; }; void printP(Engine en); ~tyer() { cout << "tyer destructor is called" << endl; } }; class Engine { private: int price; public: Engine(int p) { price = p; cout << "Engine constructor is called" << endl; } friend void PrintPrice(Engine car1); friend void tyer::printP(Engine en); ~Engine() { cout << "Engine deconstructor is called" << endl; } }; void tyer::printP(Engine en) { cout << "the friendly function of tyer is called "; cout << en.price << endl; } void PrintPrice(Engine car1) { cout << "The price of the car is :"; cout << car1.price << endl; } class car { private : tyer ty; Engine en; int color; public: car(int col, int p, int w, int l); ~car() { cout << "car deconstructor is called" << endl; } }; car::car(int col, int p, int w, int l) :color(col), en(p), ty(w, l) { cout << "car constructor is called" << endl; } int main() { car car1(2, 1, 4, 5); tyer ty1(6, 3); Engine en1(180000); PrintPrice(en1); ty1.printP(en1); return 0; }
参考链接:
https://www.coursera.org/learn/cpp-chengxu-sheji
本人博客已迁往 https://chenlongxiabc.github.io 欢迎访问。
博客内容均为自己编写,其中参考了相关内容。若有侵权他人请联系我,并对此表示歉意。若要转载或是其他用途,请联系我。我的邮箱diegefulan@hotmail.com