类中的特殊成员

类中的特殊成员:

一、静态成员

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、该对象里面的所有数据都不能被修改。因此对象里面的普通成员函数不允许被调用,只允许调用常量函数成员
posted @ 2021-11-20 11:15  宣哲  阅读(144)  评论(0编辑  收藏  举报