C++ --> 类和对象(三)
欢迎来到我的Blog,点击关注哦💕
前言
前面已经对类和对象有一定的了解,接下来再次深入的了解一下。
一、深入理解构造函数
构造函数体赋值:
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化, 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体 内可以多次赋值
class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};
初始化列表
初始化列表是在C++中构造函数中用于初始化类成员变量的一种机制。
- 它以冒号(
:
)开始,后跟以逗号分隔的成员变量列表,每个成员变量后面可以跟一个初始化表达式。
class Date
{Date(int year, int month, int day):_year(year), _month(month), _day(day){}private:int _year;int _month;int _day;
};
初始化列表使用的关键点:
- 初始化顺序:成员变量在初始化列表中的初始化顺序遵循它们在类定义中声明的顺序,而不是初始化列表中出现的顺序。
-
严格执行声明顺序即初始化顺顺序,下面的代码在语法上先进行capacity的初始化。
下面的程序会崩溃:
- 先进行_a的开辟空间,capacity没有进行初始化
- 导致capacity 是随机值。赖皮空间随机值。
class Stack
{
public:Stack(int capacity)//错误:_capacity(capacity), _a((int*)malloc(sizeof(int)* _capacity)),_size(0){}
private:int* _a;int _capacity;int _size;
};
-
特定成员的初始化:对于常量成员、引用成员以及没有默认构造函数的自定义类型成员,必须在初始化列表中进行初始化,因为这些成员不能在构造函数体内被赋值。
- 引用和const修饰都是在初始化定义的。
class A { public:A(int a):_a(a){} private:int _a; };class B { public:B(int a, int ref):_aobj(a),_ref(ref),_n(10){} private:A _aobj; // 没有默认构造函数int& _ref; // 引用const int _n; // const };
-
性能优势:使用初始化列表可以避免成员变量先默认构造后再赋值的额外步骤,特别是对于资源管理类(如持有指针或动态分配内存的类),这可以提高效率
-
成员变量的初始化只能进行一次,无论是在初始化列表中还是在构造函数体内,都不能重复初始化同一个成员变量。
class Date {Date(int year, int month, int day):_year(year), _month(month), _day(day) // ,_day(day) //在加入这句就是错误的,初始化只能进行一次。{}private:int _year;int _month;int _day; };
-
成员变量的缺省值:如果在类成员声明时指定了缺省值,这些值将在进入构造函数体之前被用于初始化列表
- 如果在定义的时候进行了传递参数,即优先使用传递的参数。
class Date
{Date(int year, int month, int day):_year(year), _month(month), _day(day){}private:int _year = 1;int _month = 1;int _day = 1;
};
- 初始化列表的灵活性:除了初始化成员变量,初始化列表还可以用于动态内存分配、类型转换赋值等操作
二、explicit 关键字
explicit
关键字用于修饰类的构造函数,以防止隐式类型转换。当一个构造函数被声明为explicit
时,它不能参与隐式转换,只能通过直接初始化或拷贝初始化的方式显式调用。
class Date
{
public:// 1. 单参构造函数,没有使用explicit修饰,具有类型转换作用// explicit修饰构造函数,禁止类型转换---explicit去掉之后,代码可以通过编译explicit Date(int year):_year(year){}Date& operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}
private:int _year;int _month;int _day;
};void Test()
{Date d1(2024);d2 = 2024;
}
三、static成员
- 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量
- 用static修饰的 成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化
static成员的特性
-
静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
-
静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
-
类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
-
静态成员函数没有隐藏的this指针,不能访问任何非静态成员
在下面的例子中:
- 没有this指针 func1 访问不了 func2
class Date { public:static void func1(){}void func2(){}private:int _year;int _month;int _day;static int count; };
-
静态成员也是类的成员,受public、protected、private 访问限定符的限制
四、友元
友元概念
- 友元(friend)是一种特殊的关系,它允许一个函数或类访问另一个类的私有成员或保护成员。
- 友元关系不是类的成员关系,而是一种独立的访问权限关系。
- 通过友元,可以在不破坏封装性的前提下,实现类之间的数据共享和功能协作
修改print:
正常访问"重载操作<<",是访问不到 Date的private成员变量的,friend很好的帮助我们突破了这个界限。
ostream& operator<<(ostream& out,const Date& d)
{out << d._year << "年" << d._month << "月" << d._day << "日" << endl;return out;
}class Date
{friend ostream& operator<<(ostream& out, const Date& d);public:Date(int year = 1, int month = 1, int day = 1): _year(year), _month(month), _day(day){}private:int _year;int _month;int _day;
};
五、内部类
内部类的特点
- 独立性:内部类是一个独立的类,不隶属于外部类。
- 访问权限:内部类可以定义在外部类的任何访问级别中,其访问外部类成员的权限取决于其自身的定义位置。
- 访问外部类成员:内部类可以直接访问外部类的
static
和enum
成员,但不能直接访问外部类的非静态成员。 - 大小关系:内部类的大小与外部类无关,
sizeof(外部类)
不会包括内部类的大小。 - 创建方式:内部类的对象可以通过外部类的作用域限定符创建,例如
外部类名::内部类名
。 - 生命周期:内部类的对象可以在栈上或堆上创建,其生命周期取决于创建方式。
{
private:static int k;int h;
public:class B // B天生就是A的友元{public:void foo(const A& a){cout << k << endl;//OKcout << a.h << endl;//OK}};
};int A::k = 1;int main()
{A::B b;b.foo(A());return 0;
}
编程题目:友元的巧妙应用
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
数据范围: 0<�≤2000<n≤200
进阶: 空间复杂度 O*(1) ,时间复杂度 O*(n)
class Solution {
public:class B{public:B(){ret +=i;++i;}};
int Sum_Solution(int n) {B a[n];return ret;
}private:
static int ret ;
static int i;
};int Solution:: ret = 0;
int Solution:: i = 1;
相关文章:

C++ --> 类和对象(三)
欢迎来到我的Blog,点击关注哦💕 前言 前面已经对类和对象有一定的了解,接下来再次深入的了解一下。 一、深入理解构造函数 构造函数体赋值: 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能…...

JS【详解】类 class ( ES6 新增语法 )
本质上,类只是一种特殊的函数。 console.log(typeof 某类); //"function"声明类 class 方式 1 – 类声明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 类表达式 匿名式 const Car class {constructor(mod…...

vue中使用$set方法给对象添加属性
vue中可以使用$set()给对象添加属性,但不是所有的对象都可以使用,vue中api明确说明,它必须用于向响应式对象上添加属性 响应式对象,vue的响应式原理,可以查看:深入响应式原理 — Vue.js ①对象赋值 this…...

【Python】ftplib的使用
仅描述基础要点,备忘。 python自带ftplib库,可实现ftp读写。 1 要点 ftp未使用默认端口21时,需显示指定端口。ftp路径带有中文,可能需要设置ftp的encoding属性为 gbk。ftplib不支持递归创建目录,需手动创建层级目录…...

CSS 【详解】CSS 函数(含 calc,min,max,clamp,cubic-bezier,env,steps 等)
函数描述CSS 版本attr()返回选择元素的属性值。2calc()允许计算 CSS 的属性值,比如动态计算长度值。3cubic-bezier()定义了一个贝塞尔曲线(Cubic Bezier)。3hsl()使用色相、饱和度、亮度来定义颜色。3hsla()使用色相、饱和度、亮度、透明度来定义颜色。3linear-grad…...

简单理解Lua 协程(coroutine)
也许更好的阅读体验 协程简单理解为可以暂停的线程,但是同一时刻只有一个协程可以处于运行状态。 文章目录 coroutine.create()coroutine.resume()coroutine.wrap()coroutine.yield()coroutine.resume()参数传递resume和yield之间互换数据 coroutine.create() lua…...

(day18) leetcode 204.计数质数
描述 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出:0示例 3…...

SadTalker数字人服务器部署
一、单独SadTalker部署 git clone https://github.com/OpenTalker/SadTalker.gitcd SadTalker conda create -n sadtalker python3.8conda activate sadtalkerpip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pyto…...

Python实现一对多WebSocket发送给指定多个客户端
在一对多的WebSocket场景下,如果你想要向特定的多个客户端发送消息,而不是广播给所有客户端,你需要维护一个能够标识每个客户端的方式,比如使用用户名或者客户端ID。这样,你就可以根据需要选择向哪些客户端发送消息。 …...

Power BI 工具介绍
Power BI是一款商业智能(BI)软件,由微软开发,旨在帮助用户将复杂的数据转化为视觉化的交互式见解。Power BI提供了一套完整的工具,包括数据连接、数据准备、数据建模、数据分析和数据可视化等功能,使用户能…...

银河麒麟高级服务器操作系统V10加固操作指南
1:检查系统openssh安全配置: 2:检查是否设置口令过期前警告天数: 3:检查账户认证失败次数限制: 修改/etc/pam.d/system-auth文件中deny的参数即可 4:检查是否配置SSH方式账户认证失败次数限制:...

(leetcode学习)15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&a…...

算法训练 | 图论Part8 | 117. 软件构建、47. 参加科学大会
目录 117. 软件构建 拓扑排序法 47. 参加科学大会 dijkstra法 117. 软件构建 题目链接:117. 软件构建 文章讲解:代码随想录 拓扑排序法 代码一:拓扑排序 #include <iostream> #include <vector> #include <queue> …...

编程从零基础到进阶(更新中)
题目描述 依旧是输入三个整数,要求按照占8个字符的宽度,并且靠左对齐输出 输入格式 一行三个整数,空格分开 输出格式 输出它们按格式输出的效果,占一行 样例输入 123456789 -1 10 样例输出 123456789-1 10 #include "stdio.…...

MySQL运维实战之ProxySQL(9.6)SQL黑名单
作者:俊达 利用mysql_query_rules表中的error_msg字段,可以实现SQL黑名单的功能。如果规则设置了error_msg,当SQL语句匹配这条规则时,proxysql会直接将error_msg的内容返回给客户端。 当遇到一些大查询严重影响数据库性能时&…...

深入了解MySQL中的innodb_lock_wait_timeout
引言 在数据库管理中,确保数据的一致性和完整性是至关重要的。MySQL的InnoDB存储引擎通过行级锁定机制来实现这一点。然而,当多个事务同时操作数据库时,可能会出现锁等待的情况。了解并合理配置innodb_lock_wait_timeout参数,对于…...

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程
自定义实现的Table控件,支持跨qt版本,兼容qt5,qt6! 截图如下所示: 黑色风格如下所示: 视频演示入口:Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…...

文章管理小程序的设计
管理员账户功能包括:系统首页,个人中心,作者管理,文章管理,文章分类管理,论坛,系统管理 微信端账号功能包括:系统首页,文章,论坛,我的 开发系统…...

Ubuntu22.04安装NIVIDIA显卡驱动总结
1.首先在安装驱动时需要判断系统有无GPU以及GPU的型号 可以参考这篇文章: https://blog.51cto.com/u_13171517/8814753#:~:textubuntu%20%E7%B3%BB%E7%BB%9F%20%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E6%9C%89%E6%B2%A1%E6%9C%89GPU%201%20%E6%…...

Redis的配置优化、数据类型、消息队列
文章目录 一、Redis的配置优化redis主要配置项CONFIG 动态修改配置慢查询持久化RDB模式AOF模式 Redis多实例Redis命令相关 二、Redis数据类型字符串string列表list集合 set有序集合sorted set哈希hash 三、消息队列生产者消费者模式发布者订阅者模式 一、Redis的配置优化 redi…...

数据结构之初始二叉树(2)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 二叉树的前置知识(概念、性质、、遍历) 通过上篇文章的学习,我们…...

如何预防最新的baxia变种勒索病毒感染您的计算机?
引言 在当今数字化时代,网络安全威胁层出不穷,其中勒索病毒已成为企业和个人面临的重大挑战之一。近期,.baxia勒索病毒以其高隐蔽性和破坏性引起了广泛关注。本文将详细介绍.baxia勒索病毒的特点、传播方式,并给出相应的应对策略…...

git列出提交记录的文件路径
一、如何列出某次提交记录中修改过/新增的文件? 方法1:使用 git diff-tree 命令来查看某个提交记录中修改过/新增的文件。具体来说,你可以使用以下命令: git diff-tree --no-commit-id --name-only -r <commit-hash>命令解…...

微信小程序密码 显示隐藏 真机兼容问题
之前使用type来控制,发现不行,修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…...

C# 中,使用 LINQ 示例 备忘
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。 此外, … 对于编写查询的开发者来说,LINQ 最明显的“语言集成”部分就是查询表达式。 …...

GaussDB DWS 详解
文章目录 GaussDB DWS 详解一、简介二、DWS的分布式架构架构概述关键组件 三、分布式查询数据查询流程SQL执行的示例 批注:本文引鉴了Forlogen博主的一些内容,并加以补充,以供学习了解。 GaussDB DWS 详解 一、简介 DWS(Data Warehouse Ser…...

【256 Days】我的创作纪念日
目录 🌼01 机缘 🌼02 收获 🌼03 日常 🌼04 成就 🌼05 憧憬 最近收到官方来信, 突然发现,不知不觉间,距离发布的第一篇博客已过256天,这期间我经历了春秋招、毕业答辩…...

3D云渲染工具对决:Maya与Blender的性能和功能深度比较
3D建模和动画制作已成为数字领域不可或缺的一环,无论是在影视特效的震撼场面,还是在游戏角色的生动表现,3D技术都扮演着至关重要的角色。而在这一领域,Maya和Blender这两款软件,以其强大的功能和广泛的应用,…...

spring.factories详解
spring.factories 是 Spring Boot 中一个重要的配置文件,它用于实现自动配置类和框架的扩展机制。这个文件通常位于项目的 resources/META-INF 目录下,并且遵循 Java 的 .properties 文件格式。以下是对 spring.factories 的详细解释: 自动配…...

从Docker Hub 拉取镜像一直失败超时?这些解决方案帮你解决烦恼
设置国内源: 提示:常规方案(作用不大) 阿里云提供了镜像源:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录后你会获得一个专属的地址 使用命令设置国内镜像源:通过vim /etc/docker/d…...