C++初阶篇----类与对象下卷

目录

  • 1.再谈析构函数
    • 1.1构造函数体赋值
    • 1.2 初始化列表
    • 1.3 explicit关键字
  • 2.Static成员
    • 2.1概念
    • 2.2 特性
  • 3.友元
    • 3.1 概念
    • 3.2友元函数
    • 3.3 友元类
  • 4.内部类
    • 4.1 概念
  • 5.匿名对象
    • 5.1 概念
  • 6.拷贝对象时的一些编译器优化
  • 7.再次理解封装

1.再谈析构函数

1.1构造函数体赋值

在对类的实例化后,也就是创建对象,都会自动调用构造函数
当对象中某一个成员已经有了初始值,但其他成员变量仍需要初始化的时候,构造函数体中的语句只能将其称为赋初值,初始化只能初始化一次,而构造函数体内可以多此赋值

1.2 初始化列表

初始化列表的概念:是一种用于在对象创建时初始化成员变量的语法。
初始化列表的组成:
以一个冒号(:)开始,接着是一个以逗号(,)分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值表达式。这些初始值将按照它们在初始化列表中的顺序来初始化对象的成员变量。

class M
{
public:
	M(char name, int age, char sex):_name(name),_age(age),_sex(sex)
	{
		if (_age < 0)
			cout << "输入错误" << endl;
		else
		{
			printf("%c", "%c", _name, _sex);
		}
	}
private:
	char _name;
	int _age;
	char _sex;
};

注意:

  1. 每个成员变量在初始化列表中只能出现一次
  2. 引用成员,const变量,自定义类型成员(无默认构造函数) ,必须放在初始化列表位置初始化
class A
{
public:
	A(int num) :_num(num)
	{	
	}
private:
	int _num;
};

class M
{
public:
	M(int x,char name, char sex):_aa(x),_name(name),_sex(sex)
	{
		//if (_age < 0)
			//cout << "输入错误" << endl;
	}
private:
	char& _name;//引用
	const char _sex;//常变量
	A _aa;//自定义
};

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

class N
{
public:
	N(int a=2) : _b(a),_a(_b)  //在这的顺序是先赋值给_b,再赋值给_a
	{
		cout << _a << endl << _b << endl;
	}
private:
	int _a;
	int _b;
};

int main()
{
	N n;
	return 0;
}

在这里插入图片描述

1.3 explicit关键字

explicit 关键字用于修饰单参数构造函数,它表明该构造函数是显式的,即不会隐式地被用于隐式类型转换。

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

不加explicit:

class N
{
public:
	//这里不加explicit
	//explicit N*(int a =2)
	N(int a=2) 
	: _a(a)  
	{
		cout << _a << endl;
	}
private:
	int _a;
};
void fun(N n)
{

}

int main()
{
	fun(1);//本应该传自定义类型N,但是编译器做了隐式转换,直接转换成 n(1)
	return 0;
}

在这里插入图片描述
加了explicit:
在这里插入图片描述
编译器会直接报错,不能实现隐式转换

2.Static成员

2.1概念

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

静态成员是属于类本身而不是类的实例的成员。静态成员可以被所有该类的实例共享,并且可以通过类名访问,而不需要创建类的实例。这使得静态成员成为存储类数据和提供类范围功能的有用工具。

class A
{
public:
	A() {
		_a++;
	}
	static int num()
	{
		return _a;
	}
private:
	static int _a;
};
int A::_a = 0;
int main()
{
	A a1, a2;
	cout << A::num() << endl;
	return 0;
}

2.2 特性

  1. 静态成员为所有类对象所共享,不属于某一个具体的对象,储存在静态区(也就与对象实例化无关)
  2. 静态成员变量必须在类外定义,定义时不添加static关键字
  3. 静态成员函数没有隐藏的**this**指针,不能访问非静态成员
  4. 静态成员受public,private,protected访问限定符得限制

注意:静态成员函数是声明为静态的类函数。它们不操作特定的对象实例,因此不能访问非静态成员变量非静态成员函数。可以通过类名直接调用静态成员函数。

3.友元

3.1 概念

友元(friend)是一种机制,允许一个类或函数访问另一个类的私有成员。通过将一个函数或类声明为另一个类的友元,可以允许该函数或类访问该类的私有成员,即使它们通常不能直接访问这些私有成员。
友元提供的是一种突破封装的方式(类比现实中的"开后门")
友元分为:友元函数友元类

3.2友元函数

class Date
{
public:
	friend void Print(const Date a);
	Date(int year=2024, int month=2, int day=29) :_year(year), _month(month), _day(day){}
	
private:
	int _year;
	int _month;
	int _day;
};

void Print(const Date a)
{
	cout << a._day << endl;
}

关于类的输出输入流(友元应用)

class Date
{
public:
	friend ostream& operator<<(ostream& cout, const Date& a);
	friend istream& operator>>(istream& cin, Date& a);
	//friend void Print(const Date& a);
	Date(int year=2024, int month=2, int day=29) :_year(year), _month(month), _day(day){}
	
private:
	int _year;
	int _month;
	int _day;
};

ostream& operator<<(ostream& cout, const Date& a)
{
	cout << a._day << " " << a._month << " " << a._year << endl;
	return cout;
}

istream& operator>>(istream& cin, Date& a)
{
	cin >> a._year >> a._month >> a._day;
	return cin;
}

int main()
{
	Date a;
	cin >> a;
	cout << a;

	return 0;
}

在这里插入图片描述

友元函数不是类的成员函数
友元函数不能用const修饰

3.3 友元类

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

  • 友元关系单向,不具有交换性(你是我朋友,不代表我是你朋友)
  • 友元关系不能传递
  • 不能继承
class Date
{
public:
	friend class A;
	friend ostream& operator<<(ostream& cout, const Date& a);
	friend istream& operator>>(istream& cin, Date& a);
	//friend void Print(const Date& a);
	Date(int year=2024, int month=2, int day=29) :_year(year), _month(month), _day(day){}
	
private:
	int _year;
	int _month;
	int _day;
};

class A
{
public:
	void Print()
	{
		//访问Date的私有成员
		cout << _num  << endl;
		cout << t._day << " " << t._month << " " << t._year << endl;
		cout << t;
	}
private:
	int _num = 10;
	Date t;
};

int main()
{
	A a;
	a.Print();

	return 0;
}

在这里插入图片描述

4.内部类

4.1 概念

如果一个类定义在另一个类的内部,这个内部类就叫做内部类
它不属于外部,不能通过外部的类的对象去访问内部类的成员

内部类是外部类的友元类,内部类可以访问外部类的对象参数,但是外部类不是内部类的友元

class A
{
private:
	int _x = 10;
	static int a;
public:
	class B
	{
	private:
		int _y = 5;
	public:
		void Print(const A& _A)
		{
			cout << a << endl;
			cout << _A._x << endl;
		}
	};
};
int A::a = 0;
int main()
{
	A::B b;
	b.Print(A());
	return 0;
}

在这里插入图片描述

5.匿名对象

5.1 概念

匿名对象是指在不给对象命名的情况下创建的临时对象。这些对象通常用于某些特定的场景,而不需要通过变量名来引用它们。

class A
{
private:
	int _x ;
public:
	A(int x=10) :_x(x)
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
	void Print()
	{
		cout << _x;
	}
};

int main()
{
	A();//生命周期只有这一行
	A().Print();//只调用函数,那么匿名对象非常快捷
	return 0;
}

在这里插入图片描述

6.拷贝对象时的一些编译器优化

在传参嗯哼传返回值的过程中,一般编译器会做一些优化来提高效率(减少不必要的对象的拷贝)

class A
{
private:
	int _x;
public:
	A(int x = 10) :
		_x(x)
	{
		cout << "A(x)" << endl;
	}
	A(const A& a)
	{
		_x = a._x;
		cout << "A(const A& a)" << endl;
	}
	A& operator=(const A& a)
	{
		if(this!=&a)
		{
			_x = a._x;
			cout << "operator=" << endl;
		}
		return *this;
	}
	~A()
	{
		cout << "~A" << endl;
	}
};

void fun(A a)
{}

A fun2()
{
	A a;
	return a;
}

传值传参

int main()
{
	A a(2);
	fun(a);

	return 0;
}

在这里插入图片描述

int main()
{
	fun(A(1));//连续构造+拷贝-》优化为一个构造

	return 0;
}

在这里插入图片描述

int main()
{
	//	fun(A(1));//连续构造+拷贝-》优化为一个构造
	A a = fun2();//  原:函数体一个构造,返回值一个构造,拷贝一个构造-》优化为一个构造
	return 0;
}

在这里插入图片描述

7.再次理解封装

现实生活中的实体计算机并不认识,计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以认识。

类是对某一类实体(对象)的来进行描述的,描述该对象的特征属性
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/433675.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于javaEE+springboot校园闲置二手物品拍卖交易平台_ngad7

为提升浏览用户观感及使用体验&#xff0c;本系统要具有易用性和美观性。通过页面的简单提示就可完成操作&#xff0c;校园闲置物品交易平台展示界面应该清楚简洁&#xff0c;使用户通过美观的前台页面能快速定位想要浏览的校园闲置物品交易平台信息。后台界面也应简约&#xf…

Ubuntu22.04系统 安装cAdvisor提示找不到 CPU 的挂载点错误解决办法。

如果我们在安装cAdvisor时容器启动不起来 查看日志如下图所示 1、查看cgroup文件系统是v2 还是 v1 mount | grep cgroup 如图所示我的是v2 &#xff0c; cAdvisor 目前的最新版本&#xff08;v0.39.0&#xff09;仍然只支持 cgroup v1&#xff0c;不支持 cgroup v2。因此&#…

CAN通信篇 - ComM模块配置(六)

文章目录 ComMConfigSetComMChannelComMUserPerChannelComMNetworkManagementComMPncComMGeneralComMGeneration总结ComM模块时通信控制模块。在ComM模块中存在三个概念:通道、用户、Pnc,但在本文我们暂时先不介绍Pnc相关功能需要的配置,仅关注基本CAN通信需要的配置。ComM模…

本机虚拟机centos7设置固定ip

一、配置虚拟机网络 1、点击编辑 2、点击更改设置 记住子网地址&#xff1a;192.168.121.0 点击确定 二、配置虚拟机网络配置文件 首先进去root中&#xff0c;然后进入vim编辑器中 (1)su - root (2) vim /etc/sysconfig/network-scripts/ifcfg-ens33 在VIM编辑器中修改并添加…

MATLAB环境下基于离散小波变换的体外血管图像处理

下面简要介绍小波变换的部分应用。 信号去噪。小波去噪是根据有效信号和噪声信号在小波变换后表现出的不同特性实现的&#xff0c;一般可用于去除语音、图像、视频等中的噪声信号。小波去噪方法根据对小波系数的非线性处理方式分为三类&#xff0c;分别是小波变换模极大值去噪…

【C++】string 类

1. 标准库中的string类 注意&#xff1a; 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。 比特就业课 3. string在底层实际是&#xff1a;basic_string模板类的别名&#xff0c;typedef b…

HBuilder X 关于404问题

大家好&#xff0c;我是晴天学长&#xff0c;本次分享来自昨天的bug调试,本分享感谢一位友友的支持&#xff0c;提供了样例图片。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .先项目再html文件 创建项目再创建html&#xff0c;实也不复杂&#xff0c;就是一个库的事情&#…

力扣经典题目解析--反转链表

原题地址: . - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 题目解析 链表&#xff08;Linked List&…

【Java】关于ZooKeeper的原理以及一致性问题,协议和算法和ZooKeeper的理论知识和应用 场景

1. 目录 目录 1. 目录 2. 什么是ZooKeeper 3. 一致性问题 4. 一致性协议和算法 4.1. 2PC&#xff08;两阶段提交&#xff09; 4.2. 3PC&#xff08;三阶段提交&#xff09; 4.3. Paxos 算法 4.3.1. prepare 阶段 4.3.2. accept 阶段 4.3.3. paxos 算法的死循环…

3d怎么拖模型---模大狮模型网

在3D建模软件中拖动(移动)模型通常是一种基本的操作&#xff0c;用来调整模型的位置或布局。以下是一般情况下在3D建模软件中拖动模型的基本步骤&#xff1a; 3d拖模型的步骤&#xff1a; 选择模型&#xff1a;在3D建模软件中选中你要拖动的模型。通常可以通过单击模型来选中它…

Docker容器化解决方案

什么是Docker&#xff1f; Docker是一个构建在LXC之上&#xff0c;基于进程容器的轻量级VM解决方案&#xff0c;实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud 基于go语言开发&#xff0c;遵从Apache2.0开源协议。 Docker 自开源后受到广泛的关注和…

qnx display

05-SA8155 QNX Display框架及代码分析(1)_openwfd-CSDN博客 backlight p: 0 t: 0 00000 SHD -----ONLINE----- 2024/03/06 13:49:22.046 backlight p:1060958 t: 1 00000 ERR backlight_be[backlight_be.c:284]: pthread_create enter 2024/03/06 13…

时钟显示 html JavaScript

sf.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>时间</title><script>function showTime(){var timenew Date();var datetime.getDate();var yeartime.getFullYear();var monthtime.getMonth()1;var …

指针乐园----上

大家好&#xff0c;我是Beilef&#xff0c;许久未见还请多多关照。 文章目录 目录 文章目录 前言 一、指针是什么 二、指针的运用 1.指针变量和地址 2.指针变量和解引⽤操作符&#xff08;*&#xff09; 解引用操作符 3.指针变量类型及意义 3.2指针的-整数 3.3 void* 指针 …

css-解决Flex布局下居中溢出滚动截断问题

css-解决Flex布局下居中溢出滚动截断问题 1.出现的问题2.解决方法2.1 Flex 布局下关键字 safe、unsafe2.2 使用 margin: auto 替代 justify-content: center2.3 额外嵌套一层 1.出现的问题 在页面布局中&#xff0c;我们经常会遇到/使用列表内容水平居中于容器中&#xff0c;一…

linux系统上安装docker 并配置国内镜像

目录 1.安装docker 2.配置国内镜像源 1.安装docker 首先要安装一个yum工具 yum install -y yum-utils 安装成功后&#xff0c;执行命令&#xff0c;配置Docker的yum源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo …

AI加速“应用现代化”,金融核心系统转型正当时

数字经济时代&#xff0c;金融机构需要快速感知客户需求&#xff0c;提升产品供给的敏捷度&#xff0c;才能在白热化的竞争环境中抢占先机&#xff0c;而无论是金融机构还是方案提供商&#xff0c;都需要深入思考核心系统现代化的内涵&#xff0c;携手迈出应用现代化的重要一步…

MySQL 核心模块揭秘 | 08 期 | 二阶段提交 (2) commit 阶段

这篇文章是二阶段提交的 commit 子阶段的前奏&#xff0c;聊聊 commit 子阶段相关的一些概念。 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&#xff0c;专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品&#xff0c;原创内…

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件&#xff01;一旦这个文件不翼而飞&#xff0c;可能会导致一些程序无法顺利运行&#xff0c;甚至给系统带来麻烦。但别担心&#xff01;遇到mfc140.dll文件丢失的情况&#xff0c;我们有一堆应对措施可以立马施行&#xff0c;确保问…

掌握Pillow:Python图像处理的艺术

掌握Pillow&#xff1a;Python图像处理的艺术 引言Python与图像处理的概述Pillow库基础导入Pillow库基本概念图像的打开、保存和显示 图像操作基础图像的剪裁图像的旋转和缩放色彩转换和滤镜应用文字和图形的绘制 高级图像处理图像的合成与蒙版操作像素级操作与图像增强复杂图形…