各位好友, 欢迎来到本期博客 !下面继续推进本章节模块下 --->静态成员 与友元函数
----->静态成员 --->static
--->static 类成员称为类的静态成员,用 static 修饰的成员函数, 称之为 静态成员函数。静态成员需要在类外进行初始化。
---->static 特性 :>
1. 静态成员为所有类对象所共享, 不属于某一个具体的对象, 存在于静态区域;
2. 静态成员变量需要放在类外进行定义, 定义时不会添加 static 关键字, 类中只是声明;
3. 类静态成员 即可用 类名 ::静态成员 或者 对象 . 静态成员 来访问;
4. 静态成员函数没有隐藏 this 指针, 不能访问任何非静态成员;
5. 静态成员也是类的成员, 受 public, protect, private 访问限定符 限制。
---->如下 :>
#include <iostrem>
using std::cout;
using std::endl;
class A
{
public:
A()
{
++_count;
}
A(const A& t)
{
++_count;
}
~A()
{
--_count;
}
static int GetCount()
{
return _count;
}
private:
static int _count;
};
int A :: _count = 0;
int main()
{
cout << A::GetCount() << endl << endl;
A a1, a2;
A a3(a1);
cout << A::GetCount() << endl << endl;
return 0;
}
为了方便好友们, 有更好地观感体验, 与更好地理解 !现 附上有彩色的代码图样 :>
----->验证 与运行结果 :>
----->友元函数 ---->friend 关键字
---->友元 -->提供了一种突破封装的方式, 有时提供便捷。但是 友元函数会增加耦合度, 从而破坏 封装性,所以友元函数不宜过多使用。
友元 :>友元函数 ~~ 友元类
(1)友元函数
前几期博文 --->赋值运算重载函数 -->已完成梳理!但是, 若将 operator<< 重载成成员函数 确实没有办法做到。因为 cout 的输出流对象 和this 指针总是会抢占第一个形参的参数位置, this 指针默认是第一个参数也就是左操作数。但是实际上 cout 需要的是第一个形参对象, 才能正常使用。因此 要将 operator<< 重载成全局函数。这会导致类外部没有办法访问成员, 此时引入 友元可进行解决, operator>> 同理 !
----->如下 :>没有突破访问限制的情况:>
----->如下 :>突破访问限制的情况:>
------>解析 :>
各位好友, 上述 类域中, 并没有 声明定义 打印函数 !但 最终打印出了正确的结果 !这就是 流操作符一种最基本的运用 !上述代码模块标注区域, 有一个 " _out " 是重定义类型变量 !
以上便是 简单演示, 用友元函数 --->突破访问限定符 !
----->说明 :>
1. 友元函数可以访问类的私有和保护成员, 但不是类的成员函数;
2. 友元函数不能用 const 来进行修饰;
3. 友元函数可以在类定义的任何地方进行声明, 不受类访问限定符限制;
4. 一个函数可以是多个类的友元函数;
5. 友元函数的调用 与普通函数的调用原理是相同的。
(2)友元类
----->友元类的所有成员函数都可以作为另一个类的友元函数,都可以访问 另一个类的非公有成员。
---->特性 :>
1. 友元关系是单向的, 不具有交换性;
2. 友元关系不能进行传递;
3.友元关系还不能继承(这在后续章节 --->会详加说明)
------>验证 :>
--->特性 一 -->
各位好友, 请注意 :>上述代码模块 标注区域 !由于在空间类 “Space”声明定义了 时间类 “Time” 是其友元。
因此, 在调用函数的过程中,时间类 “Time” 被允许访问空间类中的所有成员 ---->调试结果 -->显示
但是, 在 类 “Space” 中却不被允许 访问时间类 “Time” ,感兴趣的的好友, 可以尝试运行一下, 会发现根本就编译不通过 !
---->下面转战验证 特性二:>
---->友元关系不能进行传递
各位好友, 请注意, 标注区域 --->证明 友元函数不具有传递性 !
至此,本期模块, 已梳理完毕 !其实, 友元函数是一个特殊的存在 !虽然提供了某种程度上的便捷 !但是不符合规律性 !博主, 以后不到万不得已, 不会去使用它 !
希望, 本期模块, 能为好友们, 带来新的体验 与收获 !下一期, 继续推进 ---->再谈构造函数(升级版)---->匿名对象 ~~ 内部类