c++的类与对象(下)

1.初始化列表
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化,因为初始化只能初始化一次(初始化的本质就是只能初始化一次),而构造函数体内可以多次赋值
①.以一个冒号开始:接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或者表达式
②.初始化列表是每个成员定义的地方,不管你写不写,每个成员都要走初始化列表,不写的话,内置类型为随机值,自定义类型会调用默认构造
③.在声明给值是缺省值而非定义,这个缺省值是给初始化列表用的,如果初始化列表没有显式给值,就用这个缺省值,如果显式给值,就不用这个缺省值
④.每个成员在初始化列表中只能出现一次(初始化只能初始化一次)
⑤.类中包含以下成员,必须在初始化列表位置进行初始化
引用成员变量 - 引用必须在定义的时候初始化,而初始化列表是每个成员定义的地方
const成员变量 -const常量必须在定义的时候初始化
自定义类型成员(该类没有默认构造函数)
⑥.成员变量在类中的声明顺序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
2.explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用

A aa2=2;
//用2构造一个临时对象,再用这个临时对象拷贝构造aa2
//但编译器会优化,直接用2构造对象,只需要调用一次构造函数,而不用先调用构造函数再拷贝构造
const A&ref=2;
//必须用const修饰,因为2会生成一个临时变量,临时变量具有常性

类似

int i=0;
double d=1.1;
i=d;
//中间会生成一个临时变量

c++11支持多参数的转换

B bb2={2,2};
const B&ref={3,3};

如果用explicit修饰构造函数,将会禁止单参构造函数的隐式转换
3.static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量,用static修饰的成员函数,称为静态成员函数,静态的成员变量一定要在类外进行初始化
①.静态成员为所有类所共享,不属于某个具体的实例(静态成员变量属于整个类)
②.静态成员变量必须在类外定义,定义时不添加static关键字
在类内 static int n;
类外 int A::n=0;
③.类静态成员既可用类名::静态成员 也可以用对象.静态成员来访问
④.静态成员函数没有隐藏的this指针不能访问任何非静态成员
⑤.静态成员与类的普通成员一样,也有public,private,protected3种访问级别,也可以具有返回值
A*ptr=nullptr;
cout<n<m<<endl;
这里ptr->n,虽然ptr是空指针,但是n是静态成员变量,与用空指针调用成员函数一样,都是可以的
有没有解引用,不能看形态,要看存放的位置
static int&getm(){
return m;}
用引用返回,可以修改m
++A::getm();
私有与保护限制的是不能在类外访问,但是这个函数返回m不受影响

实现一个类,计算程序中创建出了多少个类对象

class A{public:A(){++n;++m;}A(const A&t){++n;++m;}~A(){--n;}private:int m;int n;
};

m代表一共创建了多少对象
n代表目前还有多少对象

求1+2+3+…+n,要求不能使用乘除法,for,while,if else,Switch case,位运算

class solution{class sum{public:sum(){_ret+=i;_i+=1;} };public:int getsum(int n){sum a[n];return _ret; }private:static int _ret;static int _i;	
};
int solution::_ret=1;
int solution::_i=0;

4.友元
友元分为:友元函数和友元类
友元函数提供了一种突破封装的方式,有时提供了便利,但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

友元函数

比如之前想要重载<<符号,cout的输出流对象和隐藏的this指针都在抢第一个参数的位置,this指针默认是第一个参数,但如果构造正常函数,将this指针放在第二个参数,会导致类外无法访问私有成员,故采用友元
友元函数可以直接访问类的私有成员和保护成员,它是定义在类外的普通函数,不属于任何类,不是类的成员函数,但需要在类的内部声明,声明时需要加friend关键字
①.友元函数不能用const修饰,静态成员函数也不能用const修饰,因为const修饰的实质上是形参this指针,而友元函数和静态成员函数都没有this指针
②.友元函数可以在类定义的任何地方声明,不受类访问限定符的限制
③.一个函数可以是多个函数的友元函数
④.友元函数的调用与普通函数的调用和原理相同

友元类
①.友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类的非公有成员
②.友元类是单向的,不具有交换性
③.在time类中声明date类为其友元类,那么可以在date类中直接访问time类的私有成员变量,但不能在time类中访问date类的私有成员变量
④.友元关系不能传递,如果B是A的友元,C是B的友元,不能说C是A的友元

class Date;//前置声明
class Time;
{friend class Date;//声明Date类是Time类的友元类,可以在Date类中直接访问Time类的私有成员变量public:Time(int hour,int minute,int second):_hour(hour),_minute(minute);,_second(second);{}private:int _hour;int _minute;int _second;
};
class Date{public:Date(int year=1900,int month=1,int day=1):_year(year);,_month(month);,_day(day);{}void settimeofdate(int hour,int minute,int second){_t.hour=hour;_t.minute=minute;_t.second=second;//因为已经声明了Date类为Time类的友元类,故Date类可以访问Time类的私有成员变量}private:int _year;int _month;int _day;Time _t;		
};

5.内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类,此时内部类是一个独立的类,不属于外部类,不能通过外部类的对象去调用内部类,外部类对内部类没有任何优越的访问权限
内部类是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元(友元关系不具有交换性)
①.内部类可以定义在外部类的Public,protected,private都是可以的
②.内部类可以直接访问外部类的static,枚举成员,不需要外部类的对象/类名
③.sizeof(外部类)=外部类,和内部类没有任何关系

#include <iostream>
using namespace std;
class A{private:static int k;int h;public:class B{public:void fun(){k=1;//内部类可以直接访问外部类的static,不需要对象名/类名A aa1;aa._h=1;//内部类是外部类的友元类,可以访问外部类的私有成员变量}};
};
int A::k=0;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu2204中vscode无法输入中文

解决方法&#xff1a;重新安装VSCode。 我一开始是在ubuntu商店下载的&#xff0c;结果上网查了了下&#xff0c;商店里的VSCode是阉割版的&#xff0c;想要输入中文就要重新安装。 安装流程&#xff1a;先删除再安装。 1.可以在商店里已安装界面下选择移除&#xff0c;或者…

【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 微服务 ✨特色专栏&#xff1a; 知识分享 &#x…

如何用python做自然语言处理

如何用python做自然语言处理 使用Python进行自然语言处理&#xff08;NLP&#xff09;是非常常见和强大的。以下是一些基本步骤&#xff1a; 安装所需的库&#xff1a; 首先&#xff0c;您需要安装一些用于自然语言处理的Python库&#xff0c;如NLTK&#xff08;自然语言工具包…

云原生之使用Docker部署homer静态主页

云原生之使用Docker部署homer静态主页 一、homer介绍1.1 homer简介1.2 homer特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载homer镜像五、部署homer静态主页5.1 创建挂…

rust Vec<u8>如何转成字符串?

在Rust中&#xff0c;可以使用标准库中的 String 类型将 Vec 转换为字符串。可以使用 String::from_utf8_lossy 函数将字节向量转换为字符串&#xff0c;如下所示&#xff1a; fn main() {let bytes: Vec<u8> vec![72, 101, 108, 108, 111]; // 字节向量let string St…

2023年信息系统项目管理师-学习计划安排

1. 关注信管网&#xff1a; 信管网 - 考试专业网站&#xff01; (cnitpm.com) 2023年下半年信息系统项目管理师报名时间将于8月14日开始&#xff0c;各地报名时间不同&#xff0c;请考生注意查看当地报名时间&#xff0c;但报名官网入口是统一的&#xff0c;均在中国计算机技术…

【antd】antdv中 Popover 组件内容过多,出现滚动条,滑动滚动条Popover会自动关闭

antdv版本&#xff1a;1.78 vue版本&#xff1a;2.5.2 <a-popover trigger"click" placement"topLeft"><template slot"content"><div wheel.stop""> //关键是这里<a-table:loading"loading":columns&…

kafka权威指南(阅读摘录)

零复制 Kafka 使用零复制技术向客户端发送消息——也就是说&#xff0c;Kafka 直接把消息从文件&#xff08;或者更确切地说是 Linux 文件系统缓存&#xff09;里发送到网络通道&#xff0c;而不需要经过任何中间缓冲区。这是 Kafka 与其他大部分数据库系统不一样的地方&#…

【雕爷学编程】MicroPython动手做(32)——物联网之MQTT

MQTT &#xff08;Message Queuing Telemetry Transport&#xff09;消息队列遥测传输协议&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在1999年发布。M…

Unity CanvasGroup组件

文章目录 1. 简介2. 组件属性2.1 Alpha(透明度)2.2 Interactable(是否为可交互)2.3 Blocks Raycasts(是否接受射线监测)2.4 Ignore Parent Groups(忽视上层的画布组带来的影响) 1. 简介 CanvasGroup(画布组) 组件&#xff0c;可集中控制整组 UI 元素(自身和所有子物体)的某些属…

C# Blazor 学习笔记(6):热重置问题解决

文章目录 前言热重置问题描述解决方法演示 总结 前言 我最近在使用Blazor的时候&#xff0c;使用了BootstrapBlazor&#xff08;以下简称BB&#xff09;创建模板的时候&#xff0c;发现热重置无效。经过了一上午的折腾&#xff0c;我终于解决了这个问题。 热重置 问题描述 …

用Rust实现23种设计模式之抽象工厂

在 Rust 中&#xff0c;可以使用 trait 和泛型来实现抽象工厂模式。抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一个接口来创建一系列相关或依赖对象的家族&#xff0c;而无需指定具体的类。下面是一个简单的示例&#xff0c;展示了如何使用 Rust 实现抽象工厂模式&…

Rust- 结构体

In Rust, a struct (short for “structure”) is a custom data type that lets you name and package together multiple related values that make up a meaningful group. If you’re coming from an object-oriented language, a struct is like an object’s data attrib…

OpenHarmony ArkUI 如何调用相机

​ ArkUI调用相机和调用相册其实是一个思路&#xff0c;只用修改一个地方。 我们继续来说相机调用&#xff0c;ArkUI没办法自己获取相机&#xff0c;所以得依靠一下ohos.multimedia.camera 相机开发指导 介绍 本指导主要展示了调用相机的调用过程&#xff0c;以及调用相机的…

EasyExcel工具类,一键实现表格导入导出,有无对应实体类均可

EasyExcel工具类&#xff0c;一键实现表格导入导出&#xff0c;有无对应实体类均可 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但…

图的存储.

# 图的存储 ## 题目描述 给定一个 n 个顶点 m 条边的无向图。请以邻接矩阵和邻接表的形式输出这一张图。 ## 输入格式 第一行输入两个正整数 n 和 m&#xff0c;表示图的顶点数和边数。 第二行开始&#xff0c;往后 m 行&#xff0c;每行输入两个以空格隔开的正整数 u,v&…

数学对智能的作用与副作用

毋庸置疑&#xff0c;数学在人工智能与智能领域中发挥着不可或缺的作用&#xff0c;它提供了构建模型、优化算法、概率推理、机器学习和数据分析等关键工具&#xff0c;帮助实现智能系统的自主学习、决策和优化能力&#xff0c;数学对智能发展的作用巨大&#xff0c;具体如下&a…

前端vue uni-app自定义精美海报生成组件

在当前技术飞速发展的时代&#xff0c;软件开发的复杂度也在不断提高。传统的开发方式往往将一个系统做成整块应用&#xff0c;一个小的改动或者一个小功能的增加都可能引起整体逻辑的修改&#xff0c;从而造成牵一发而动全身的情况。为了解决这个问题&#xff0c;组件化开发逐…

HTTP(超文本传输协议)学习

关于HTTP补学 一、HTTP能干什么 通过下图能够直观的看出&#xff1a;“交换数据 ” 二、HTTP请求例子 一个 HTTP 方法&#xff0c;通常是由一个动词&#xff0c;像 GET、POST 等&#xff0c;或者一个名词&#xff0c;像 OPTIONS、HEAD 等&#xff0c;来定义客户端执行的动作。…

Zabbix分布式监控配置和使用

目录 1 Zabbix监控的配置流程2 添加主机组3 添加模板4 添加主机5 配置图形6 配置大屏7 新建监控项7.1 简介7.2 添加监控项7.3 查看数据7.4 图表 8 新建触发器8.1 概述8.2 添加触发器8.3 显示触发器状态 1 Zabbix监控的配置流程 在Zabbix-Web管理界面中添加一个主机&#xff0c;…