温习一下内存分布模型
c++在执行代码的时候。将内存大致划分为4个区域
- 代码区(文本区):存放代码的(二进制),操作系统管理
- 全局区:存放全局变量和静态变量
- 堆:由程序员分配释放
- 栈:操作系统分配释放
静态成员是指声明为static的类成员在类的范围内所有对象共享某个数据。
静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问类中的非静态数据成员(因为非静态数据成员只有对象存在时才有意义)。但静态数据成员和静态成员函数可由任意访问权限许可的函数访问。和一般成员函数类似,静态成员函数也有访问限制,私有静态成员函数不能由外界访问。
静态成员函数没有this指针,因此,静态成员函数只能直接访问类中的静态成员,若要访问类中的非静态成员时,必须借助对象名或指向对象的指针。
************************
友元是一种定义在类外部的普通函数,但它需要在类的内部进行说明,为了与该类的成员函数加以区别,在说明时前面加上关键字friend。友元不是成员函数,但它可以访问类中的私有成员。其作用是提高程序的运行效率。
C++语言中的友元函数为在类外访问类中的私有成员和保护成员提供了方便,但破坏了类的封装性和隐蔽性。友元可以是一个函数,称为友元函数,也可以是一个类,称为友元类。友元函数和友元类统称为友元。
定义友元函数的方式是在类定义中用关键词friend说明该函数,其格式如下:
friend <类型> <友元函数名> (<参数表>);
友元函数说明的位置可在类的任何部位,既可在public区,也可在protected区,意义完全一样。友元函数定义则在类的外部,一般与类的成员函数定义放在一起。
C++允许说明一个类为另一个类的友元类(friend class)。
如果A是B的友员类,则A中的所有成员函数可以像友员函数一样访问B类中的所有成员。定义格式如下:
class B
{ friend class A; //A的所有成员函数均为B的友员函数
//…
}
总结
友元函数是为了突破类的访问权限,进而增加程序的运行效率,同时也破坏了类的封装性和隐蔽性。
友元函数不属于类成员函数
友元类:A是B的友元类 B是C的友元类 A可以访问B所有成员 B可以访问C的所有成员,但是 A访问不了C ,A和B是朋友,B和C是朋友 但是AC不一定是朋友!