当前位置: 首页 > article >正文

初识C++(3)

目录

一、初始化列表:

1、概念:

2、特性:

二、static成员:

1、概念:

2、特性:

三、友元

1、概念:

友元函数:

友元类:

四、内部类:

1、概念:

2、特性:


一、初始化列表:

1、概念:

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。

虽然构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。初始化只能初始化一次,而构造函数体内可以多次赋值。

初始化列表:

        以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。

class Date
{
public:
	// 初始化列表
	Date(int mon, int day)
		:_mon(mon)
		, _day(day)
	{}

private:
	int _mon;
	int _day;
};

2、特性:

1、每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)。

2、类中包含以下成员,必须放在初始化列表位置进行初始化:

{1、引用成员变量    2、const成员变量    3、自定义类型成员(且该类没有默认构造函数时)}

3、尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量, 一定会先使用初始化列表初始化。

4、成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

二、static成员:

1、概念:

        声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数静态成员变量一定要在类外进行初始化

class Test
{
private:
	// n不是属于某一个对象,属于所有对象,属于整个类
	static int n; // 类中声明,类外定义

public:
	// 如果想在类外访问n: 1、突破类域,该为共有 2、该为成员函数访问
	static int GetN() //静态成员函数没有this指针
	{
		return n;
	}
};

// 定义:
int Test::n = 1;

2、特性:

1、静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。

2、静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明

3、类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。

4、静态成员函数没有隐藏的this指针,不能访问任何非静态成员。

5、静态成员也是类的成员,受public、protected、private 访问限定符的限制

三、友元

1、概念:

友元分为:友元函数和友元类 

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。

友元函数:

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字

如下:重载运算符<< 并让类按指定格式输出

class Date
{
public:
	Date(int mon = 0, int day = 0)
		: _mon(mon)
		, _day(day)
	{}

	// 友元声明,让其能访问类中的私有成员
	friend ostream& operator<<(ostream& cout, const Date& d);

private:
	int _mon;
	int _day;
};

ostream& operator<<(ostream& cout, const Date& d)
{
	// 因为进行了友元声明,所以可以直接访问Date类的私有成员
	cout << d._mon << "月" << d._day << "日" << endl;

	return cout;
}

int main()
{
	Date d1(2, 7);
	// 让cout能直接输出d1并生成指定格式
	cout << d1;
}

特性:

1、友元函数可访问类的私有和保护成员,但不是类的成员函数

2、友元函数不能用const修饰

3、友元函数可以在类定义的任何地方声明,不受类访问限定符限制

4、一个函数可以是多个类的友元函数

5、友元函数的调用与普通函数的调用原理相同 

友元类:

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

class Test1
{
public:
	// 声明Test2为Test1的友元类,则在Test2中就能直接访问Test1的成员
	friend class Test2;

	Test1(int a = 0, int b = 0)
		: _a(a)
		, _b(b)
	{}
private:
	int _a;
	int _b;
};

class Test2
{
public:
	Test2(int x = 0, int y = 0)
		: _x(x)
		, _y(y)
	{}

	//  可以直接访问Test1私有的成员变量
	void Test1make(int a = 1, int b = 1)
	{
		t1._a = a;
		t1._b = b;
	}
private:
	int _x;
	int _y;

	Test1 t1;
};

特性:

1、友元关系是单向的,不具有交换性

(如上Test2为Test1的友元,Test2能访问Test1的私有成员,但Test1无法访问Test2的私有成员)

2、友元关系不能传递

如果C是B的友元, B是A的友元,则不能说明C是A的友元。

3、友元关系不能继承

四、内部类:

1、概念:

        如果一个类定义在另一个类的内部,这个类就叫做内部类。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

注意内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元

class A
{
public:
	class B // b天生就是a的友元
	{
	public:
		void Print(const A& a)
		{
			cout << x << endl;
			cout << a.y << endl;
		}
	};
private:
	static int x;
	int y;
};

int A::x = 1;

int main()
{
	A::B b;
	b.Print(A());
	return 0;
}

2、特性:

1、内部类可以定义在外部类的public、protected、private

2、注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名

3、sizeof(外部类)=外部类,和内部类没有任何关系


http://www.kler.cn/a/231607.html

相关文章:

  • WebRTC实现双端音视频聊天(Vue3 + SpringBoot)
  • Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置
  • ArcGIS Pro ADCore DAML
  • 蜀道山CTF<最高的山最长的河>出题记录
  • 2024-11-17 -MATLAB三维绘图简单实例
  • 基于Python的仓库管理系统设计与实现
  • 【QT+QGIS跨平台编译】之二十七:【librttopo+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 嵌入式软件设计方式与方法
  • Android:国际化弹出框
  • 数据结构:双向链表
  • 负载均衡SLB
  • elasticsearch重置密码操作
  • Netty中使用编解码器框架
  • 【数据结构】二叉树的三种遍历(非递归讲解)
  • 通过docker-compose部署NGINX服务,并使该服务开机自启
  • Fink CDC数据同步(四)Mysql数据同步到Kafka
  • 数据同步工具对比——SeaTunnel 、DataX、Sqoop、Flume、Flink CDC
  • 电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)
  • golang 引入swagger(iris、gin)
  • Tkinter教程21:Listbox列表框+OptionMenu选项菜单+Combobox下拉列表框控件的使用+绑定事件
  • libevent源码解析--event,event_callback,event_base
  • 前端bug手册
  • 【npm】修改npm全局安装包的位置路径
  • 极智芯 | 解读国产CPU系列汇总
  • 【c++】STL详解(一):string类的使用
  • 子类将基类的虚函数替换为其自己的虚函数,共用的一个虚函数表,怎么不影响基类