C++——静态友元常量成员

一、静态成员

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. 类中的静态函数成员,这个函数同样也不属于对象,而是属于类的,所以在这个函数中不能操作类中的普通数据成员和普通成员函数,因为这些普通成员是必须在有对象的时候才会被建立的,而静态函数不用对象也能调用。
  2. 访问和静态数据成员一致
  3. 在这个静态函数成员中,不能访问这个类的普通成员,因为那些普通成员是需要有对象才会创建的,但是静态函数成员没对象也能用。可以在这个静态函数中使用局部变量,形参,静态数据成员。

二、单例模式

单例模式:是一种常用的软件设计模式。通过单例模式可以保证系统中,应用改模式的类只有一个实例对象
单例模式的类中提供私有下的构造函数(默认,拷贝构造就够了)
包含一个本身这个类的私有的静态对象(指针或实例化的,几乎写的都是指针的)
提供一个静态的公有函数去创建或获取这个私有的对象

三、友元成员

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
	//如果是要给类中的多个数据初始化中间用‘,’号隔开
}

初始化列表的特性

  1. 初始化列表也是实现类中成员数据的初始化的一种方式
  2. 一些特殊情况下,数据成员的初始化只能用初始化列表的方式给数据成员赋值,而不能在构造函数中直接赋值
  3. 初始化列表必须写在构造函数的定义体后面
  4. 构造函数能对数据的初始化工作,初始化列表也可以,但是初始化列表能做的,构造函数不一定能
  5. 初始化列表的初始化顺序是按照他们在类中出现的顺序来初始化的,而不是在初始化列表中写的顺序来初始化的

4.常量函数成员

1、定义:
class node
{
	int id=10;
public:
	void fun()const
	{
		id=10;//报错
	}
	void fun1()const;//类内声明
};
void node::fun1()const//类外实现
{}
//在这个函数中,不能修改类中的数据成员(静态数据可以)

特点
类中的常量函数成员,在这个函数中不能对自身变量进行修改,通过语法限定,只要是this指针所指向的所有数据都不可以被修改(静态数据可以改变)。可以用来帮助我们来限定自身来调用这个函数修改自身的数据

5.常量对象

  • 在对象实例化的时候在类名前面加上const修饰,该对象为常量对象,满足常量的操作,声明时必须初始化。
  • 该对象里面的所有数据都不能被修改。因此对象里面的普通成员函数不允许被调用,只允许调用常量函数成员
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值