static修饰类的成员
回顾一下C中的static的作用
<1>static修饰全局变量:限制全局变量的作用域
<2>static修饰局部变量:延长局部变量的生命周期
<3>static修饰函数: 限制了函数的作用域
案例:
学生类 学生学号想让它自增,如何实现?
static修饰类的数据成员
初始化:类内声明,类外初始化
类的静态数据成员特点:
属于类但是不属于某一个对象;所有的对象共用一个变量
没有对象也可以进行访问
访问:
1. 类名::变量名;
2. 对象名.变量名; 指针类型对象名->变量名;
解决问题:
当我们想要实现数据共享的时候,就可以使用类的静态的数据成员!
例如: 统计个数、ID自增!
static修饰类的成员函数
特点:
静态的成员函数没有this指针;
静态的成员函数只能访问静态的成员,不能访问非静态成员
非静态的成员函数可以访问静态的成员
访问:
类名::成员函数();
对象.成员函数(); 指针对象->成员函数();
应用: 共享
案例:
设计一个Ctool类,然后这个类就是用来做共享,说明这个类里面的成员函数都设计成静态!
Class Ctool
{
Static voidgotoxy(int x, int y);
Static voidpaintWindow(int x, int y, int w, int h);
};
使用: 类名::gotoxy(10,20);
const修饰类的成员
回顾const作用:
Const int b = 10; // b的值不可以修改
const int *a = &b; // *a不可以修改,a的值是可以变化的
int * const a= &b; // a的值不可以修改, 但是*a的值是可以变化的
const的右侧是什么,什么不能变!
2-1. const修饰类的数据成员
Const修饰数据成员,数据成员的值是不可以修改的!
如何初始化:
使用初始化列表的方式,在构造函数首部的后面;这个类的所有的构造函数都要用初始化列表对const修饰的数据成员进行初始化
非const修饰的数据成员也可以使用初始化列表进行初始化
应用场景:就是一些类的数据成员值一旦设计好了是不可以修改的,例如身份证ID
2-2、const修饰的成员函数
<1>const修改的成员函数就变成了常函数,本质上修饰的隐藏起来的参数 this!
只能访问成员但是不能修改。
<2>const修饰的成员函数中是不能调用非const修饰的成员函数的!
<3>非const修饰的成员函数中是可以调用const修饰的成员函数的
应用: 例如教务系统中我们只能查看成绩,成绩有问题是不能自己去修改!
const修饰类的对象
const修饰的类对象(常对象),不能调用非const修饰的成员函数;只能调用const修饰的成员函数!
常对象只能调用常函数!
笔试题目:问程序的输出结果
用const修饰了成员函数,这个函数就不能对数据成员进行修改,如果我在一种特殊的情况下,一定要修改数据成员的值,怎么办?
mutable关键字
作用:解决const修饰的成员函数中没法修改数据成员值的问题
使用: 就是在数据成员声明的前面加上 mutable
尽量少用!!!因为他其实会破坏我们类封装的完整性!除非万不得已!
友元
友元就是朋友的意思!
关键字: friend
什么时候选择用友元:多次频繁的访问或者修改类的数据成员的时候
解决问题:
<1>普通的函数做类的友元
注意:
友元函数不是类的成员函数,所以不受类的访问限定符的限制!
<2> 一个类的成员函数做友元:类中的成员函数要频繁的访问另外一个类的数据成员
类要做前向声明
类中的成员函数要类的外部去定义
<3>整个类做朋友:类中的多个成员函数要频繁的访问另外一个类的数据成员,将整个类作为朋友!
存在的问题:
友元会破坏类封装的完整性!没有特殊情况尽量不使用!