C++初阶--类与对象(3)(图解)

文章目录

  • 再谈构造函数
    • 初始化列表
    • 隐式类型转换
    • explicit关键字
  • static成员
  • 友元类
  • 内部类
  • 匿名对象
  • 拷贝函数时的一些优化

再谈构造函数

在我们之前的构造函数中,编译器会通过构造函数,对对象中各个成员给出一个适合的初始值,但这并不能称之为初始化,只是进行赋值而已因为初始化只能初始化一次,而构造函数内部可以进行无数次赋值

初始化列表

初始化列表是用于构造函数中对类成员变量进行初始化的语法特性
通过初始化列表,可以在对象被创建时就将成员变量初始化为指定的值,而不是在构造函数体内逐个赋值。

语法:初始化列表用冒号(:)跟随在构造函数的参数列表之后,并且在构造函数体之前
在初始化列表中,成员变量按照声明顺序列出,并使用逗号进行隔开。
每个成员变量的初始化由成员变量名后跟一个圆括号和初始值或者调用其他构造函数来完成。

试验:

class A
{
private:
	int _a;
public:
    A(int a = 1)
		:_a(a)
	{
	}
	/*A(int* a)
		:_a(a)
	{
	}*/
	A(const A& a)
	{
		_a = a._a;
		cout << "A(const A& a)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;

	}
};

class Date
{
private:
	int _year;
	int _month;
	int _day;
	int& _def;
	const int _n;
public:
	Date(int year, int month = 1, int day = 1)
		:_year(year),
		_month(month),
		_day(day),
		_def(year),
		_n(10)
		
	{
	}
};
int main()
{
	Date d1=2023;
	Date d2 = (2023, 11, 4);

	Date d3 = { 2023, 11, 4 };
	return 0;
}

对const成员和引用成员进行测试:

Date的成员变量

在这里插入图片描述
Date类的构造函数
在这里插入图片描述
定义一个对象并初始化为(2023,10,23);
在这里插入图片描述
对于引用和const变量来说,都必须进行初始化
在这里插入图片描述

规范写法:

在这里插入图片描述
在这里插入图片描述

成员变量中有自定义类型时:

在这里插入图片描述
在这里插入图片描述

成员的顺序:

在这里插入图片描述

初始化列表没写全的话:
在这里插入图片描述
在这里插入图片描述

如果自定义类型不是默认构造函数的话:

在这里插入图片描述

在这里插入图片描述

对于自定义类型成员变量的类对象,可以:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

隐式类型转换

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

多个参数时

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

explicit关键字

这是一个修饰符,用于修饰类的构造函数。当一个构造函数被explicit修饰时,他将被标记为显示构造函数,意味着该构造函数无法进行隐式类型转换

在这里插入图片描述
在这里插入图片描述

static成员

静态类成员静态类成员是被类所有对象所共享的成员变量。它们被声明为静态成员后,在内存中只有一个副本存在,并且在任何实例化对象之前就已经存在了。静态类成员必须在类的外部进行初始化定义。
静态成员函数静态成员函数不在特定的对象上操作,它们没有this指针,可以直接通过类名来访问。

class A
{
public:
	A()
	{
		count++;
	} 
	A(const A& a1)
	{
		count++;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
	//调取count成员变量的函数
	//静态成员函数,特点:没有this指针
	static int GetCount()
	{
		return count;
	}
private:
	//声明
	static int count;
};
//定义
int A::count = 0;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

友元类

友元类是描述两个类之间的特殊关系;
当一个类是另一个类的友元类时,则该类可以访问另一个类的私有成员
通过在类的声明中使用friend关键字来声明友元类。

class Time
{
public:
	friend class Date;
	//在Time中声明Date类,在Date中可以直接访问Time的成员变量
	Time(int hour=1,int mintue=0,int sec=0)
		:_hour(hour),
		_mintue(mintue),
		_sec(sec)
	{}
private:
	int _hour;
	int _mintue;
	int _sec;
};

class Date
{
private:
	int _year;
	int _month;
	int _day;
	Time _t;
public:
	Date(int year, int month, int day)
		:_year(year),
		_month(month),
		_day(day)
	{

	}
	void SetTime(int hour, int minute, int sec)
	{
		//可以直接访问私有的成员变量
		_t._hour = hour;
		_t._mintue = minute;
		_t._sec = sec;
	}
};

在这里插入图片描述

内部类

内部类是一个类的内部定义的另一个类。内部类可以访问外部类的所有成员,包括私有成员,而外部类不能直接访问内部类的成员

class A
{
private:
	static int k;
	int h;
public:
	class B//B天生为A的友元
	{
	public:
		void f(const A& a)
		{
			cout << k << endl;//k是静态成员,可以直接使用
			cout << a.h << endl;//h是非静态成员,需要有明确的类对象
		}
	};


	~A()
	{
		cout << "~A()" << endl;
	}
};

int A::k = 1;

int main()
{
	A::B b;//B在A类中需要加上作用域符
	
	b.f(A());//A()是匿名对象
	return 0;
}

在这里插入图片描述

匿名对象

匿名对象是在使用过程中直接创建的没有具体名称的对象
它们通常用于临时执行某个方法或操作,或者作为方法的返回值。

语法:ClassName();

实例:

class Foo()
{
public:
    void display()
    {
        cout<<"this is a Foo"<<endl;
    }
}
int main()
{
    Foo().display();
}

拷贝函数时的一些优化

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

 void func1(A aa)
{
	cout << "func()" << endl;
}

A func2()
{
	A aa;
	return aa;
}

A func3(A aa)
{
	
	return aa;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

链表经典面试题之二

今天我们做一道环形链表的题目力扣141题https://leetcode.cn/problems/linked-list-cycle/ 这道题让我们分析链表中是否存环&#xff0c;存在的话返回true&#xff0c;不存在返回false。首先看到这道题我们要捋顺思路&#xff0c;怎么才能达到它要的效果&#xff1f;要找出是否…

Leetcode刷题详解—— 组合总和

1. 题目链接&#xff1a;39. 组合总和 2. 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些…

【网络开发必看】聊聊 Tomcat

文章目录 1. 什么是 Tomcat2. 怎么安装 Tomcat3. Tomcat 的目录结构3.1 bin 目录3.2 conf 目录3.3 lib 目录3.4 log 目录3.5 webapps 目录 4. 启动 Tomcat总结 1. 什么是 Tomcat Tomcat 是一个 HTTP 服务器. 前面学习了 HTTP 协议, 知道了 HTTP 协议就是规定 HTTP 客户端和 HT…

论文笔记:AttnMove: History Enhanced Trajectory Recovery via AttentionalNetwork

AAAI 2021 1 intro 1.1 背景 将用户稀疏的轨迹数据恢复至细粒度的轨迹数据是十分重要的恢复稀疏轨迹数据至细粒度轨迹数据是非常困难的 已观察到的用户位置数据十分稀疏&#xff0c;使得未观察到的用户位置存在较多的不确定性真实数据中存在大量噪声&#xff0c;如何有效的挖…

ffmpeg安装教程(windows、Linux下python环境)

本文旨在向大家介绍ffmpeg在Windows和Linux系统中的安装方法。 目录 一、Windows 安装 ffmpeg1.1 官网下载 ffmpeg 运行程序1.2 环境配置1.3 测试 二、Linux 安装ffmpeg2.1 Linux中安装ffmpeg2.2 python环境安装 ffmpeg2.1.1 为什么要介绍这个2.1.1 成功安装示例 一、Windows …

OpenCV-Python小应用(九):通过灰度直方图检测图像异常点

OpenCV-Python小应用&#xff08;九&#xff09;&#xff1a;通过灰度直方图检测图像异常点 前言前提条件相关介绍实验环境通过灰度直方图检测图像异常点代码实现输出结果 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff…

笔记:AI量化策略开发流程-基于BigQuant平台(一)

从本文开始&#xff0c;按照AI策略开发的完整流程&#xff08;共七步&#xff09;&#xff0c;上手在BigQuant平台上快速构建AI策略。本文首先介绍如何使用证券代码模块指定股票范围和数据起止日期。重要的事情说三遍&#xff1a;模块的输入端口有提示需要连线的上游数据类型&a…

Activiti6工作流引擎:Form表单

表单约等于流程变量。StartEvent 有一个Form属性&#xff0c;用于关联流程中涉及到的业务数据。 一&#xff1a;内置表单 每个节点都可以有不同的表单属性。 1.1 获取开始节点对应的表单 Autowired private FormService formService;Test void delopyProcess() {ProcessEngi…

十八数藏的新时代探索:数字创新助推文化保护

在这个数字化的新时代&#xff0c;传统文化和数字创新的结合呈现出令人振奋的新面貌。十八数藏&#xff0c;作为文化数字创新的佼佼者&#xff0c;正以数字化的手段助推文化的保护与传承。 十八数藏通过数字技术&#xff0c;将传统非物质文化遗产以数字形式呈现&#xff0c;使其…

红黑树-RBTree

目录 1. 红黑树的概念2. 红黑树的性质3. 结点的定义4. 结点的插入5. 整体代码 1. 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式…

Echarts柱状体实现滚动条动态滚动

当我们柱状图中X轴数据太多的时候&#xff0c;会自动把柱形的宽度挤的很细&#xff0c;带来的交互非常不好&#xff0c;因此就有一个属性来解决&#xff1a;dataZoom 第一种简易的版本&#xff0c;横向滚动。 dataZoom: {show: true, // 为true 滚动条出现realtime: true, // 实…

第七章 块为结构建模 P4|系统建模语言SysML实用指南学习

仅供个人学习记录 这部分感觉很模糊&#xff0c;理解的不好&#xff0c;后面的图也没画了&#xff0c;用到的时候再来翻书 应用端口实现接口建模 端口port表示了块边界上的一个访问点&#xff0c;也可以是由该块分类的任何组成或引用边界上的可访问点。一个块可以有多个端口规…

Java学习 10.Java-数组习题

一、创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100 代码实现 public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < arr.length; i) {arr[i]i1;}System.out.println(Arrays.toString(arr));} 运行结果 二、改变…

指针传 1

1. 内存 在计算机中内存划分为⼀个个的内存单元&#xff0c;每个内存单元的⼤⼩取1个字节。每个内存单元放了八个bite位&#xff0c;就像我们在高中时住的八人间&#xff0c;那么每个人就代表了一个bite位。 每个内存单元也都有⼀个编号&#xff08;这个编号就相当 于我们所住…

2000-2022年上市公司数字化转型同群效应数据

2000-2022年上市公司数字化转型同群效应数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;股票代码、年份、行业代码、行政区划代码、数字化转型程度-A、数字化转型程度-B、同行业同群-数字化转型程度-A_均值、同行业同群-数字化转型程度-A_中位数、同省份同群-数字化…

odoo16 库存初始化 excel导入问题

最近在为一家公司实施odoo时&#xff0c;发现库存模块实施过程中按用户实际&#xff0c;产品初始化就是个问题。下面一一记录下 一个新公司&#xff0c;产品都有上百种&#xff0c;甚致几千种&#xff0c;如何把现有产品数据录入系统就是个不小的活。odoo16是有导入导出功能不…

1994-2021年分行业二氧化碳排放量数据

1994-2021年分行业二氧化碳排放量数据 1、时间&#xff1a;1994-2021年 2、来源&#xff1a;原始数据整理自能源年鉴 3、指标&#xff1a;统计年度、行业代码、行业名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧化碳排放量、煤油二氧化碳排放…

管理能力测评,如何提升管理能力?

管理能力是综合能力的体现&#xff0c;通常也解读为组织管理能力&#xff0c;如果要再细分的话&#xff0c;可能还包括有沟通能力&#xff0c;协调能力&#xff0c;组织能力&#xff0c;执行力和专业能力等等。不过没有办法说的太细节&#xff0c;因为每个部分铺开了都是一个独…

基于51单片机RFID射频门禁刷卡系统设计

**单片机设计介绍&#xff0c; 基于51单片机RFID射频门禁刷卡系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序程序 六、 文章目录 一 概要 基于51单片机RFID射频门禁刷卡系统&#xff0c;是一种将单片机技术和射频标识技术应用于门禁控制系统的…

自主开发刷题应用网站H5源码(无需后端无需数据库)

该应用使用JSON作为题库的存储方式&#xff0c;层次清晰、结构简单易懂。 配套的word模板和模板到JSON转换工具可供使用&#xff0c;方便将题库从word格式转换为JSON格式。 四种刷题模式包括顺序刷题、乱序刷题、错题模式和背题模式&#xff0c;可以根据自己的需求选择适合的模…