【C++复习】第一弹-基础性语法
前言
学习了C++语法这么久了,我其实觉得,我们学习一门语言应该更加注重使用性,对于语法的细节可以通过具体的项目去重新造轮子的时候再去抠细节,也就是说你得学会先走,在去想我们如何走的,身体的哪些肌肉在发力,这些对于我们目前可以不用在意细节,结合实际来去记忆,这个才是高效可取的,今天的前言唠叨就到这人呀!如果你有兴趣,就接下来看下面的几个问题。
1.C++是如何实现函数重载的呢?
为什么要有函数重载呢?我们发现在C语言中我们不同的参数就会重新定义一个一模一样的函数来去调用这个接口,这对我们来说违背设计原则,代码的复用低,整个项目就会看着非常庞大。C++在这个方面提出来第一个改进。
回答:C++在编译阶段 ,允许同一作用域下的功能相近的不同形参的函数定义为同一函数名,在底层汇编根据不同参数形成不同的函数名放入符号表中,在后续代码生成可以根据函数名的不同来实现对不同参数的同名函数调用。
除此之外,使用extern关键字可以使用C语言的风格来进行编译。就不支持函数重载。
2.指针和引用的区别?
为什么要有引用呀?打个比方我们通常对于其他的经常使用的数据,我们每一次开一个空间,再把他的地址存进去,在解引用,会不会显示的很繁琐,也很浪费CPU资源,本质是是没有问题的,可是我们直接操作变量里面的数据是不是更加便利一点,引用的概念就被提出来了。
回答:①指针是地址,引用是给变量起别名。指向的是变量里面的数值,可以直接操作数据,不用接引用,我们对指针++是地址++,对引用++是里面的数值++,考虑一些特殊情况,指针可以为空或者野指针,因为新的地址变量可以为空,但是引用不能为空,他必须指向一个对象。
②指针和引用可以作为形参,指针可以修改指向的变量,所以可以通过传递大型对象的指针,来避免开辟空间,指针可以为悬空只要不接引用就不会报错,但是引用直接传的就是变量,我们操作变量就能操作数据,更加简洁。
③因为指向的是底层变量的数据,所以他的底层实现还是用指针的思想实现的。除此之外,指针和引用做返回值代表的意思也是不一样的。指针可以返回动态开辟的空间,引用可以直接返回可以操作的对象,比如类成员或者全局的变量 。
④指针的具体场景:内存分配,数组操作,链表,图等,引用的场景参数避免复杂开销,返回值。
3.nullptr和NULL的区别?
为什么要提出nullptr呢?其实就是对0这个值的再次细粒度划分,避免二义性,到底是空地址还是数值0。
回答:nullptr是一个类型安全的空指针常量。可以调用nullptr_t 得构造方法去隐式的转换不同的类型,而NULL确实需要自己去进行强制类型转换,并不安全,压根就不知道是整数类型还是之指针类型。
4.如何替换宏?
我们知道程序进行预处理的第一步就是处理#子开头的程序,比如程序替换,头文件展开等等,但是宏不进行类型安全检查,然后运算过程时十分容易出现问题。这个时候就得想到替换方案。
宏的优点:代码的复用性高,提高性能。
宏的缺点:会因为运算符的优先级导致运算出错,没有类型检查不安全,不方便调试。
回答: const 和enum 来替换宏成员,内连函数可以替换宏函数。
5.类与对象?
5.1理解面向你对象和面向过程?
面相对象更加关注的是类与类对象之间的交互。面向过程更关注具体过程的实现。在解决实际问题上,面相对象更加完整,每个对象都有自己的属性和方法,而且更容易扩展。耦合度关联度低,比较松散,面向过程是一些结构体和函数,比较紧凑。
面相对象的特性:封装、继承、多态。
封装:
第一层理解用C语言实现一个栈,定义结构体,变量和函数,把结构体当做参数传进去。
第二层理解:为了更规范的去使用数据。避免一会访问数据一会访问方法。C++把想访问的定义为公有,不想 访问的去定义为私有。同时只能通过函数去调用数据。这样的管理更符合高内聚低耦合的设计原则,也更方便管理数据。
继承:
类层次的复用,给类之间加上关系,更加简化代码逻辑。
多态:
静态的多态和动态的多态,静态的多态就是函数重载或者cout自动识别类型,以及函数模版。动态的多态是运行时多态,对象里有虚表指针,指向虚表,虚表里存放虚函数,子类对象可以重写父类对象的虚函数,指向父类调父类,指向子类调子类。
5.2 默认成员函数
简单理解为初始化,清理,括号(),等号=,移动构造,移动复制, 取地址,const &取地址。实现一个简易的string。见下面代码
#include <iostream>
#include <cstring>
#include <utility> // for std::swap
using namespace std;
class String {
public:// 默认构造函数String() : data_(new char[1]) {*data_ = '\0';}// 构造函数String(const char* str) : data_(new char[strlen(str) + 1]) {strcpy(data_,str);}// 拷贝构造函数String(const String& rhs) : data_(new char[rhs.size() + 1]) {strcpy(data_, rhs.c_str());}// 移动构造函数String(String&& rhs) noexcept : data_(rhs.data_) {rhs.data_ = nullptr;}// 拷贝赋值运算符String& operator=(const String& rhs) {if (this != &rhs) {String temp(rhs);swap(temp);}return *this;}// 移动赋值运算符String& operator=(String&& rhs) noexcept {if (this != &rhs) {delete[] data_;data_ = rhs.data_;rhs.data_ = nullptr;}return *this;}// 析构函数~String() {delete[] data_;}// 获取字符串大小size_t size() const {return strlen(data_);}// 获取原始C字符串const char* c_str() const {return data_;}// 交换函数void swap(String& rhs) {std::swap(data_, rhs.data_);}// 下标运算符char& operator[](size_t index) {return data_[index];}const char& operator[](size_t index) const {return data_[index];}// 比较运算符==bool operator==(const String& rhs) const {return strcmp(data_, rhs.data_) == 0;}// 比较运算符<bool operator<(const String& rhs) const {return strcmp(data_, rhs.data_) < 0;}
private:char* data_;
};int main() {String s1("Hello");String s2("World");String s3 = s1;s3 = std::move(s2); // 使用移动赋值运算符std::cout << "s1: " << s1.c_str() << std::endl;//std::cout << "s2: " << s2.c_str() << std::endl;std::cout << "s3: " << s3.c_str() << std::endl;return 0;
}
5.3其他成员
static修饰类成员
const修饰成员函数
this指针可以为空指针,不解引用就不会崩
this指针在栈区,因为是形参,VS为了提高效率,放入寄存器中,他指向的对象在堆栈或者全局,但他本身计算临时变量,通常在栈区。
友元,友元函数可以直接访问全部的成员。加一个friend关键字,一般用于重写<<和>>
内部类,内部类就是外部类的友元,反过来不是,内部类可以通过外部类的对象参数进行访问外部类,枚举类型和static可以直接访问。
相关文章:
【C++复习】第一弹-基础性语法
前言 学习了C语法这么久了,我其实觉得,我们学习一门语言应该更加注重使用性,对于语法的细节可以通过具体的项目去重新造轮子的时候再去抠细节,也就是说你得学会先走,在去想我们如何走的,身体的哪些肌肉在发…...
软考高级备考记录
一 报考条件和报名流程 报考条件 该考试具有水平考试性质,报考任何级别不需要学历、资历条件,只要达到相应的专业技术水平就可以报考相应的级别 报名流程 软考报名官网:中国计算机技术职业资格网 官网上有 报名时间,考试…...
图为大模型一体机新探索,赋能智能家居行业
在21世纪的今天,科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网,从大数据到人工智能,每一项技术创新都在为人类带来前所未有的便利与效率。其中,图为AI大模型一体机作为人工智能领域的最新成果&#…...
精氨酸/赖氨酸多肽(芋螺肽)
产品简介: 芋螺肽,源自瑞士尖端科技,是一种模拟芋螺毒素的生物活性肽。它以其独特的分子结构和高选择性作用于电压门控钠离子通道(特别是Nav1.4),为您提供安全、自然且不僵硬的回春效果。芋螺肽࿰…...
C++音视频04:音视频编码、生成图片
视频编码 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out) {int ret -1;ret avcodec_send_frame(ctx, frame);if (ret < …...
ImageSharp报错
错误信息 System.MissingMethodException: Method not found: System.Span1<SixLabors.ImageSharp.PixelFormats.Rgba32> SixLabors.ImageSharp.Memory.Buffer2D1.GetRowSpan(Int32).需要升级项目 原来仅升级了SixLabors.ImageSharp没有升级drawing,都升级到…...
Android中常用adb命令
目录 1.adb连接安卓模拟器 2.adb列出所有已经连接的设备 3.adb显示设备的日志信息 4.adb 电脑文件推送到安卓模拟器中 5.adb 手机传送文件到电脑 6.adb获取安卓应用的包名和Activity名 附录 1--命令 1)adb devices 2)adb install 路径> 3)…...
PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
引言 PostgreSQL的JSONB数据类型非常灵活,提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表,演示各种JSONB操作符,并讨论如何使用倒排索引和部分索引来优化性能。 理解PostgreSQL中的JSONB JSONB,即JS…...
tornado,flaskd这两个框架主要是干什么的
Tornado是一个Python的Web框架,主要用于构建高性能的异步Web应用程序。它基于非阻塞的网络I/O模型,可以处理大量并发连接,适用于需要处理实时性要求较高的应用场景,如实时聊天、实时数据推送等。 Flask是另一个Python的Web框架&a…...
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导
Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导 Sigrity除了可以进行交流噪声分析,同样也可以进行压降仿真分析,以下图为例. 3D view...
国产游戏技术能否引领全球?
国产游戏技术能否引领全球? 引言 近年来,中国游戏产业如同春天的嫩芽,迅速成长为全球最大的市场之一。或许你会想,国内的游戏开发者到底在技术上取得了多大的成就?这些成就又能否推动中国游戏走向世界,甚…...
【前端】在 Next.js 开发服务器中应该如何配置 HTTPS?
在 Next.js 的开发环境中,默认情况下是使用 HTTP 协议的。但是,您可以通过一些配置来启用 HTTPS。这在开发阶段可能很有用,尤其是在需要测试涉及安全传输的应用场景时。 下面是如何在 Next.js 开发环境中配置 HTTPS 的步骤: 方法…...
基于深度学习算法的动物检测系统(含PyQt+代码+训练数据集)
基于深度学习算法的动物检测系统(含PyQt代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现五、讨论5.1 模型优缺点分析5.2 实验意义 参考资料 前言 本项目是基于Mobil…...
微信小程序美团点餐
引言:外卖已经成为了都市人的必备,在无数个来不及(懒得)做饭的时刻拯救孤单寂寞的胃。美团外卖无疑是外卖届的领头羊,它的很多功能与设计都值得我们学习。本文将从五个方面,对美团外卖展开产品分析…...
音频剪辑还花钱?2024年这4款免费工具让你告别烦恼
音乐迷们!是不是还在为找个音频剪辑软件就得花钱这事儿头疼呢?别急,2024年有好几个既免费又特别给力的音频剪辑免费的小帮手来了,保证帮你省下这笔钱,还让你用得爽歪歪!来来来,让我给你们介绍4个…...
【YOLO模型】(4)--YOLO V3超超超超详解!!!
文章目录 YOLO V3一、改进二、三种scale三、残差连接四、核心网络结构1. 结构2. 输出与先验框关系 五、softmax层替代 总结 YOLO V3 YOLO V3是由Joseph Redmon等人在2018年推出的一款目标检测算法。作为YOLO系列的第三代版本,它在实时性和准确性上取得了显著的提升…...
管理类联考 信息整理和经验分享
说明:大家在准备读MBA之前,肯定会去百度下MBA的相关常识,然而一上某度 你就发现 各种广告、各种培训机构 铺天盖地而来,想了解一些有价值的信息都有些困难,因此这些我在这里做了一些整理,方便准备参加 MBA …...
JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案
目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题?1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一:通过自定义属性禁用GPU加速3.2 方法二&…...
《泛基因组:高质量参考基因组的新标准》
摘要 随着三代测序技术的进步和高质量参考基因组的发布,研究者们发现单一个体的参考基因组无法全面代表整个物种的遗传序列。这一现象导致了群体遗传变异图谱的不完整。为了解决这一问题,构建来自多个个体的泛基因组成为一种有效的方法。 泛基因组研究…...
模型其他压缩方法
文章目录 模型蒸馏模型剪枝除了模型量化之外,下面再介绍两种常见的模型压缩方法,即模型蒸馏和模型剪枝。与模型量化不同,模型蒸馏和模型剪枝则通过精简模型的结构,进而减少参数的数量。 不同表示精度的模型性能对比 模型蒸馏 模型蒸馏(ModelDistillation)的目标是将复杂…...
Python学习的自我理解和想法(22)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第22天,学的内容是正则表达式,明天会出一篇详细实例介绍。电脑刚修好!开学了,时间不多&…...
基于neo4j的糖尿病知识图谱数据
基于Neo4j的糖尿病知识图谱项目:毕业设计必备💡 这个项目,专为需要深入挖掘医学或AI数据的朋友们量身定制,尤其适合用于毕业设计!如果你对图谱构建、AI问答系统、或者正在学习Neo4j,那么你不得不看看这个技…...
分布式搜索引擎elasticsearch操作文档操作介绍
1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,…...
C++ 中的可调用对象
目录 一.可调用对象简介 1.什么是可调用对象? 2.可调用对象有什么用? 二.函数指针和仿函数 1.函数指针 a.函数指针的使用语法 b.函数指针的应用场景 2.仿函数 a.仿函数的基本概念 b.仿函数的优点 三.lambda表达式和function 1.lambda表达式 …...
[HBase]二 HBase原生Shell命令大全
HBase原生Shell命令汇总 1. General组 5 1.1. 查看集群状态:status 5 1.2. 查看表的操作方法:table_help 5 1.3. 查看HBase的版本信息:version 5 1.4. 查看当前用户:whoami 5 2. Namespace组 5 2.1. 创建命名空间:create_namespace 5 2.2. 显示命名空…...
Kafka之消费者客户端
1、历史上的二个版本 与生产者客户端一样,在Kafka的发展过程当中,消费者客户端主要有两个大的版本: 旧消费者客户端(Old Consumer):基于Scala语言开发的版本,又称为Scala消费者客户端。新消费…...
使用Python进行数据分析入门
文章目录 Python环境搭建安装Anaconda验证安装 必备库介绍NumPyPandasMatplotlibSciPy 数据导入与清洗导入数据清洗数据 数据探索与分析描述性统计相关性分析 数据可视化绘制直方图 高级主题机器学习深度学习 总结 随着大数据时代的到来,数据分析变得越来越重要。Py…...
ubuntu20 从源码编译升级到版本5.15.263
author: hjjdebug date: 2024年 10月 25日 星期五 15:38:48 CST description: ubuntu20 从源码编译升级到版本5.15.263 我的内核是 5.15.105, 用apt 下载源码后其版本是5.15.263 为什么要从源码编译内核. 升级内核? 目的: 练练手. 消除内核神秘性. 还可以裁减内核,也是调试内核…...
php 程序开发分层与验证思想
在PHP程序开发中,合理的层级设计可以提高代码的可维护性、可扩展性和可测试性。以下是常见的层级设计模式及建议: 1. 分层架构 通常可以将PHP应用分为以下几层: 表示层(Presentation Layer): 负责与用户交…...
关于InternVL2的单卡、多卡推理
关于InternVL2的单卡、多卡推理 前言单卡推理多卡推理总结前言 本章节将介绍如何使用上一章节微调后的模型进行推理。推理又分为单卡和多卡,这里介绍的两种方式都是Hugging Face的transformers方法进行推理。模型的话可以使用上一章微调的任意一个非lora模型进行测试。 单卡推…...
wordpress空间安装教程/百度网盘提取码入口
在继续学习之前,你需要对下面的知识有基本的了解 1.HTML/XHTML 2.CSS 3.JavaScript/DOM 什么是AJAX? AJAX异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意…...
做海报裂变的网站/百度移动点击排名软件
AndroidStudio 引入 aidl 文件,一般来说,有两种方法.第一种方法直接在 src/main 目录下新建 aidl 文件夹,并将我们的 aidl 文件放到该目录下。因为 AndroidStudio 默认的 aidl 文件默认配置是这样的。第二种方法 把 adil 文件拷贝到libs文件夹…...
免费婚恋网站设计/百度手机助手app安卓版官方下载
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37609579/article/details/103054993 <!--一个博主专栏付费入口结束--><link rel"…...
湛江网站建设招聘/官网建站多少钱
这里写目录标题函数模板1.2.2 函数模板注意事项1.2.3 函数模板案例调用规则类模板与函数模板区别类模板与继承类模板成员函数类外实现#pragma once类模板与友元案例重新定义【】stl2.2 STL基本概念STL六大组件容器算法迭代器初识vectorvector容器嵌套容器string容器string赋值操…...
wordpress hook api/优化关键词的方法
笔记目录 线性方程组与矩阵 线性方程组列对齐后可以写成矩阵乘法的形式 求解$A\cdot xv $时, 即要求取向量x 经矩阵A变换后与向量v重合。 可以分为以下两种情况讨论 \(det(A)!0\) 如果A的行列式不为0,则可以对向量v进行逆变换求解x; 即对v左乘…...
网站反向绑定域名/如何优化关键词
在 multi-voltage design 中,常常用到isolation cell,本文简单介绍什么是 iso cell, 何时需要加 iso cell,以及如何使用 iso cell 1. 什么是 iso cell ? isolation cell 一般用于隔离两个不同的 power domain …...