类中的特殊成员
类中的特殊成员:
一、静态成员
1、知识点介绍
静态成员,指的是在C++类中声明成员时,可以加上static关键字,这样声明的成员叫静态成员,静 态成员分为静态数据成员和静态函数成员两种
2、静态数据成员的定义
class node
{
public:
static int id;//静态数据成员定义
}
int node::id=10;//静态数据成员类外初始化
3、静态数据成员的特点
1、类中的静态数据成员无论公有还是私有,必须要在类外初始化。
2、类中的静态数据成员,所以的对象都共享该数据,这个静态数据成员只有一份内存在内存中。
3、类中的静态数据成员,可以在类中被重新赋值,可以被普通函数访问,如果该成员时公有属性,那么 就还可以在类外被对象自己访问,或者通过类名访问 node::id; node n; n.id;
4、类中的静态数据成员会在主函数执行之前构造
5、可以直接通过类名访问公有下面的静态数据成员 类名::静态数据成员
4、静态函数成员定义
class node
{
public:
static void fun(){}//在类中定义
static void fun1();//类中声明
}
void node::fun1(){}//在类外定义
5、静态函数成员的特点
1、类中的静态函数成员,这个函数同样也不属于对象,而是属于类的,所以在这个函数中不能操作类中 的普通数据成员和普通成员函数,因为这些普通成员是必须要有对象的时候才会被建立,而静态函数不用对象 也能调用。
2、可以直接通过类名访问公有下面的静态函数成员 类名::静态函数成员
3、在这个静态函数成员中,不能访问这个类的普通成员,因为那些普通成员是需要有对象才会创建的, 但是静态函数成员没对象也能用。可以在这个静态函数中使用局部变量,形参,静态数据成员。
他们都跟对象没有关系,但是都可以被对象使用
理解成:静态成员不是属于对象,属于类1,对象存在还是不存在,静态成员都存在。
二、友元成员
友元分为友元函数和 友元类
1、知识点介绍
类的特性之一就是封装,而友元就是C++为用户提供打破这种封装的手段,友元分为友元函数和友元对象
2、友元函数
1、友元函数不是类的成员,通过对象是无法访问这个友元函数,但是在这个函数中有权访问类中的所有成员(需要通过对象访问)。
2、友元函数,无论声明在类中的任访问属性下都可以,不影响他的调用和访问
//示例
class node
{
public:
int id=10;
friend void fun(node &n);
}
void fun(node &n){cout<<n.id<<endl;}
//调用:
node n;
fun(n);//输出10
3、友元类
//示例:
class A
{
//B是A的友元,则B能访问A中的数据
friend class B;
int id;
}
class B
{
public:
void fun(A & a)
{
cout<<a.id<<endl;
}
}
4、友元的特性
1、单方向:B是A的朋友,B可以访问A的数据,A不可以访问B的数据。
2、不传递:A是B的朋友,B是C的朋友,A和C没有朋友关系
3、不继承: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
//如果是要给类中的多个数据初始化中间用‘,’号隔开
}
初始化列表的特性
1、初始化列表也是实现类中成员数据的初始化的一种方式
2、一些特殊情况下,数据成员的初始化只能用初始化列表的方式给数据成员赋值,而不能在构造函数中直接赋值
3、初始化列表必须写在构造函数的定义体后面
4、构造函数能对数据的初始化工作,初始化列表也可以,但是初始化列表能做的,构造函数不一定能
5、初始化列表的初始化顺序是按照他们在类中出现的顺序来初始化的,而不是在初始化列表中写的顺序来初始化的
4、常量函数成员
class node
{
int id=10;
public:
//常量函数的定义
void fun()const
{
id=10;//报错
//在类中的常量函数成员中,不能对类中的普通数据成员进行修改
}
void fun1()const;//类内声明
};
void node::fun1()const//类外实现
{
//在这个函数中,不能修改类中的数据成员(静态数据可以)
}
2、特点 :
1、类中的常量函数成员,在这个函数中不能对自身变量进行修改,通过语法限定,只要是this指针所 指向的所有数据都不可以被修改(静态数据可以改变)。
2、可以用来帮助我们来限定自身来调用这个函数修改自身 的数据(提高代码的可读性)
5、常量对象
1、在对象实例化的时候在类名前面加上const修饰,该对象为常量对象,满足常量的操作,声明时必须初始化。
2、该对象里面的所有数据都不能被修改。因此对象里面的普通成员函数不允许被调用,只允许调用常量函数成员