静态成员
静态成员,指的是在C++类中声明成员时,可以加上static关键字,这样声明的成员叫静态成员。
静态成员分为静态数据成员和静态函数成员两种。
静态数据成员
- 类中静态数据成员,所有对象都共享该数据,只有一份内存。
- 类中的静态数据成员,必须要在类外初始化,因为他属于类。
- 类中的静态数据成员,可以在类中被重新赋值,可以被普通函数访问,如果该成员时公有属性,那么就还可以在类外被对象自己访问,或者通过类名访问。
下面举例子,来更加深入的了解静态数据成员。
- 以上报错的原因是类中的静态数据成员id只声明,但还未定义,定义的方式如下:
- 类中的静态数据成员不属于对象,属于类的。
- 静态数据成员可以通过类名直接访问。
静态函数成员
- 类中的静态函数成员,这个函数同样也不属于对象,而是属于类的。
- 访问和静态数据成员一致。
- 在这个静态函数成员中,不能访问这个类的普通成员。
举例理解:
- 以下num标红的原因:类是在对象出现之前就出现了,所以会报错
- 在静态函数成员里面不允许操作类中的普通成员和调用普通的函数成员,只运行操作类中静态数据成员及块作用域数据。
静态的五种用法
-
修饰块作用域变量,内存在全局数据区,使用在块内。
-
修饰全局变量,内存在全局数据区,使用在当前文件内。
- 补充知识:extern 设置全局变量,可在其他文件使用。
- 补充知识:extern 设置全局变量,可在其他文件使用。
-
修饰普通函数,C语言中普通函数默认全局使用,加static修饰之后,该函数只能在当前文件中使用。
-
修饰类中成员数据,所有对象共享该数据成员。
-
修饰类中函数成员,函数也是被所有对象共享,且在该函数中只能操作静态数据成员。
单例模式
单例模式是一种常用的软件设计模式。
通过单例模式可以保证系统中,应用该模式的类只有一个实例对象。
class MyStu
{
static MyStu*p; //定义一个静态的对象指针,不属于对象,属于类
int id;
private: //私有或保护,构造数据将无访问权限,那么将无法产生对象
MyStu()
{
}
public:
static MyStu*createMyStu(); //静态的成员函数
static void clear();
};
MyStu*MyStu::p = NULL; //定义
MyStu*MyStu::createMyStu()
{
if (p == NULL)
p = new MyStu;
return p;
}
void MyStu::clear()
{
if (p != NULL)
delete p;
p = NULL;
}
void main()
{
MyStu*p = NULL;
p = MyStu::createMyStu(); //创建一个无名的堆对象,且仅有一个
MyStu*p = MyStu::createMyStu();
MyStu::clear();
}
友元
-
类的特性之一就是封装。
-
友元是C++为用户提供打破这种封装的手段。
-
友元分为友元函数和友元类
友元的特点:单方向,不传递,
- 单方向:CA是MyStu的朋友,可以访问它的数据,但MyStu不是CA的朋友,不能访问CA的数据。
- 不传递:A是B的朋友,C是B的朋友,但是A和C没有关系。
- 不继承:A是B的朋友,A可以访问B的数据,C是B的父亲,A和C没有直接关系。
常量成员
常量成员,指的是在C++类中声明对象成员时可以加上const关键字,这样声明的成员叫常量成员。
常量成员分为常量数据成员和常量函数成员。
举例理解:
- 常量数据成员的初始化通过:成员初始化列表来完成
- 成员初始化列表:写在构造函数定义的()后面,通过 : (冒号)的方式来表示
- 成员初始化列表:写在构造函数定义的()后面,通过 : (冒号)的方式来表示
常量函数成员:在函数的后面加const。
通过语法来限定在该函数成员内是无法修改类中的数据成员。
红色波浪线都是报错的。