今天学习的内容是静态数据成员,静态成员函数,友元。
1.静态数据成员
作用:某一数据被多个对象所共享。
存储方式:静态的数据成员在内存只占一份空间(分配在对象之外)
作用域:静态数据成员的作用域只限于轻易该类的作用域内,使用的时候可以直接通过对象名引用或者类名引用,因此静态数据成员不论有没有对象的创建都可以直接引用。
生存期:静态数据成员在编译阶段就会分配整个程序结束才释放。
初始化:静态数据成员可以初始化,但只能在类体外进行初始化,一般形式:
数据类型 类名::静态数据成员名=初值;(静态数据和全局变量一样,倘若我们没有对其进行初始化系统回默认是为0)《注意:不能用构造函数的参数初始化表对静态数据成员初始化,因为构造函数只对非静态数据成员进行初始化》
引用:每个对象都可以引用(静态数据成员既可以通过对象名引用,也可以通过类名来引用,对象名引用形式:对象名.数据成员,类名引用形式:类名.数据成员)。
好处:静态数据成员相较于全局变量,不会破坏了封装性,对数据成员起到保护作用,符合面向对象程序的要求。
代码举例:
2.静态成员函数
目的:为了能处理静态数据成员(处理不用实列化对象时,可以通过类名访问《和访问静态数据成员一样,在不创建对象的情况下也可通过类名进行引用》)
作用域:静态成员函数可以直接引用本类中的静态成员,不能访问本类中的非静态成员。(非静态成员函数有this指针,而静态成员函数没有this指针,因此决定了静态成员函数不能访问本类中的非静态成员)
调用:静态成员函数是类的一部分而不是对象的一部分,如果要在类外调用公有的静态成员函数,要用类名与作用域运算符::。
注意:公有的成员函数可以引用本对象中的一般数据成员(非静态数据成员),也可以引用类中的静态数据成员。
代码举例:
3.友元
利弊:面向对象程序设计的一个基本原则是封装性和信息隐蔽而友元却可以访问其他类中的私有成员,这就是对封装性的一个破坏。但是他能有助于数据共享,能提高程序的效率,但是我们要重视它的副作用,不要过多地使用友元。
友元函数:友元函数可以访问这个类的私有成员(可以将普通股函数和其它类的成员函数设为朋友)
代码举例:将普通函数声明为友元函数:
代码举例:用友元成员函数访问私有数据
值得注意的是这里对类进行了“提前引用“的声明,即在正式声明一个类之前,先声明一个类名,表示此类将在稍后声明。程序第三行就是提前引用。
友元类
声明:一般形式:friend 类名;(不仅可以将一个函数声明为一个类的“朋友“,而且可以将一个类(例如b类)声明为另一个类(例如a类)的”朋友“。这时b类就是a类的友元类。友元类b中的所有函数都是a类的友元函数,可以访问a类中的所有成员。)
注意:(1).友元的关系是单向的不是双向的。如果声明了b类是a类的友元类,不等于a类是b类的友元类,a类中的成员函数不能访问b类中的私有成员。
(2).友元的关系不能传递,如果b类是a类的友元类,c类是b类的友元类,不等于a类是b类的友元类。
4.公用数据的保护:
常对象:形式:类名const 对象名 [(实参表)];或者const’可以放在类名前。
定义时必须同时初始化;作用:保护数据不被改变。
常成员函数(只能引用不能改变):void get()const;(const是函数的一部分必须要加)
在声明函数和定义函数时必须加;调用时不加。
常数据成员:只能通过构造函数的参数初始化表对其进行初始化。常对象所有数据成员均为常数据成员。
对象的常引用:既能保证数据安全,使数据不被随意修改。提高运行效率。在调用函数时有