一、静态成员
1.知识点介绍
静态成员:加上static关键字,静态成员分为静态数据成员和静态函数成员两种
2.静态数据成员定义
class node
{
public:
static int id;//静态数据成员定义
}
int node::id=10;//静态数据成员类外初始化
3.静态数据成员的特点
- 类中静态数据成员,所有对象都共享该数据,只有一份内存存在内存中
- 类中静态数据成员,必须要在类外初始化,因为它不属于对象,属于类,对象存在还是不存在这个静态成员都是存在的,而且静态数据成员声明周期时程序开始就存在(主函数运行之前),直到程序结束才会释放。
- 类中的静态数据成员,可以在类中重新赋值,也可以被普通函数访问。如果是公有属性,那么也可以在类外被对象访问。
4.静态函数成员定义
class node
{
public:
static void fun(){}//在类中定义
static void fun1();//类中声明
}
void node::fun1(){}//在类外定义
5.静态函数成员的特点
- 类中的静态函数成员,这个函数同样也不属于对象,而是属于类的,所以在这个函数中不能操作类中的普通数据成员和普通成员函数,因为这些普通成员是必须在有对象的时候才会被建立的,而静态函数不用对象也能调用。
- 访问和静态数据成员一致
- 在这个静态函数成员中,不能访问这个类的普通成员,因为那些普通成员是需要有对象才会创建的,但是静态函数成员没对象也能用。可以在这个静态函数中使用局部变量,形参,静态数据成员。
二、单例模式
单例模式:是一种常用的软件设计模式。通过单例模式可以保证系统中,应用改模式的类只有一个实例对象
单例模式的类中提供私有下的构造函数(默认,拷贝构造就够了)
包含一个本身这个类的私有的静态对象(指针或实例化的,几乎写的都是指针的)
提供一个静态的公有函数去创建或获取这个私有的对象
三、友元成员
1.知识点介绍
类的特性之一就是封装,而友元就是C++为用户提供打破封装的手段,友元分为友元函数和友元对象。
2.友元函数
- 友元函数,他只是一个函数,友元函数不是类的成员,通过类对象是无法访问的,但是在这个函数中有权访问类中的所以成员。
- 友元函数,无论声明在类中的任何访问属性下都可以,不影响他的调用和访问。
示例:
class node
{
int id=10;
friend void fun(node &n);
}
void fun(node &n){cout<<n.id<<endl;}
调用:
node n;
fun(n);//输出10
3.友元类
友元类是一个单独的类,只不过和友元函数一样,在类中声明了一个友元列,在这个友元类中同样也可以访问类中所有成员。在A类中声明B类为A类的友元类,那么在B类中就可以访问A类中的所有成员。
示例:
class A
{
friend class B;
int id;
}
class B
{
public:
void fun(A & a)
{
cout<<a.id<<endl;
}
}
4.友元的特性
- 单方向:B是A的朋友,B可以访问A的数据,A不可以访问B的数据
- 不传递:A是B的朋友,B是C的朋友,A和C没有朋友关系
- 不继承:A是B的朋友,B是C的父亲,A和C没有关系
四、常量成员
1.知识点介绍
常量成员:指的是在C++类中声明对象成员时可以加上const关键字,常量成员分为常量数据成员和常量函数成员。
2.常量数据成员
1、定义
class node
{
const int id;
}
2、初始化
可以在定义的时候直接在后面赋值 const int id=10;//不建议使用,有的版本可能不支持
或者通过初始化列表的方式初始化
3.初始化列表的使用
1、初始化列表要写在构造函数的后面。如下:
class node
{
const int id;
public:
node ():id(10)
{}
//把10赋值给id
}
当然,普通的数据成员也可以这样初始化
class node
{
const int id;
int age;
public:
node ():id(10),age(20)
{}
//把10赋值给id,20赋值给age
//如果是要给类中的多个数据初始化中间用‘,’号隔开
}
初始化列表的特性
- 初始化列表也是实现类中成员数据的初始化的一种方式
- 一些特殊情况下,数据成员的初始化只能用初始化列表的方式给数据成员赋值,而不能在构造函数中直接赋值
- 初始化列表必须写在构造函数的定义体后面
- 构造函数能对数据的初始化工作,初始化列表也可以,但是初始化列表能做的,构造函数不一定能
- 初始化列表的初始化顺序是按照他们在类中出现的顺序来初始化的,而不是在初始化列表中写的顺序来初始化的
4.常量函数成员
1、定义:
class node
{
int id=10;
public:
void fun()const
{
id=10;//报错
}
void fun1()const;//类内声明
};
void node::fun1()const//类外实现
{}
//在这个函数中,不能修改类中的数据成员(静态数据可以)
特点
类中的常量函数成员,在这个函数中不能对自身变量进行修改,通过语法限定,只要是this指针所指向的所有数据都不可以被修改(静态数据可以改变)。可以用来帮助我们来限定自身来调用这个函数修改自身的数据
5.常量对象
- 在对象实例化的时候在类名前面加上const修饰,该对象为常量对象,满足常量的操作,声明时必须初始化。
- 该对象里面的所有数据都不能被修改。因此对象里面的普通成员函数不允许被调用,只允许调用常量函数成员