以下内容为大学期间学习C++语言总结的知识:
《C++》基础入门_01——数据存储,表示形式,基本运算
《C++》基础入门_02——面向对象的总体概括
《C++》基础入门_03——程序的开发过程
《C++》基础入门_04——四大语句
《C++》基础入门_05——函数详解篇
《C++》基础入门_06——面向对象的详述
《C++》基础入门_07——数据的共享保护:const
《C++》基础入门_08——利用数组实现对批量数据的处理
《C++》基础入门_09——指针和引用的讲解
《C++》基础入门_10——用户自定义数据类型详细篇
《C++》基础入门_11——友元的讲解
《C++》基础入门_12——类模板
《C++》基础入门_13——运算符的重载
《C++》基础入门_14——继承与派生
《C++》基础入门_15——多态性
《C++》基础入门_16——输入输出流详讲
《C++》基础入门_17——对象串行化
《C++》基础入门_18——异常处理
《C++》基础入门_19——命名空间
《C++》基础入门_20——文件操作
《C++》基础入门_21——在函数中返回数组的常用方法
一、友元
- 友元是C++提供的一种破坏数据封装和数据隐藏的机制。
- 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。
- 可以使用友元函数和友元类。
- 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量少使用友元。
二、友元函数
- 若在本类以外其他地方定义一个友元函数(可以是其他类的成员函数,也可以是不属于任何类的非成员函数),在本类体中用friend对其声明,此函数就成为本类的友元函数,可以访问本类的私有成员。
- 友元函数是在类声明中由关键字friend修饰说明的非本类成员函数,在它的函数体中能够通过对象名访问 private成员,protected成员,public成员。
- 作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。
- 访问对象中的成员必须通过对象名。
2.1 将普通函数声明为本类友元函数
#include <iostream>
using namespace std;
class Box{
public:
Box(){}
Box(int h ,int w):height(h),width(w){}
void volume();
static void show();
friend void display(Box &b);
static int length;
private:
int height;
int width;
static int c;
};
void Box::volume() {
cout<<"体积为:"<<height<<"*"<<width<<"*"<<length<<"="<<height * width*length<<endl;
}
void Box::show() {
cout << "静态私有成员c:" << c << " 静态公有成员length:" <<length<< endl;
}
int Box::length = 5;
int Box::c = 6;
void display(Box &b) {
b.width = 3;
b.height = 3;
b.c = 3;
b.length = 3;
b.volume();
b.show();
}
void main() {
Box b; //调用普通构造函数
display(b);
/*
体积为:3*3*3=27
静态私有成员c:3 静态公有成员length:3
*/
}
2.2 友元成员函数(其他类的成员函数)
#include <iostream>
using namespace std;
class Display; //对Box类的声明
class Box {
public:
Box() {}
Box(int h, int w) :height(h), width(w) {}
void volume(Display &); //成员实参必须是Display类对象
static int length;
private:
int height;
int width;
static int c;
};
class Display {
public:
Display() { a = 10; b = 5; }
void display();
friend void Box::volume(Display &);//将Box类中的volume作为本类友元函数
private:
int a;
int b;
};
void Display::display() {
cout << "a=" << a << " b=" << b << endl;
}
void Box::volume(Display &d) {
d.display(); //引用Display私有变量必须加对象名
d.a = 20;
d.b = 20;
d.display();
cout << "体积为:" << height << "*" << width << "*" << length << "=" << height * width*length << endl;
}
int Box::length = 5;
int Box::c = 6;
void main() {
Display d;
Box b(7,7);
b.volume(d);
/*
a=10 b=5
a=20 b=20
体积为:7*7*5=245
*/
}
三、友元类
- 类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。
- 声明语法:将友元类名在另一个类中使用friend修饰说明
- 如果声明B类是A类的友元, B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据。