当前位置: 首页 > news >正文

C++基础从0到1入门编程(三)

系统学习C++
方便自己日后复习,错误的地方希望积极指正
往期文章:
C++基础从0到1入门编程(一)
C++基础从0到1入门编程(二)
参考视频:
1.黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难
2.系统化学习C++

1 简单链表 共同体 枚举

链表

在这里插入图片描述
单链表:节点之间只能单向的联系
双链表:可以双向联系

struct st_girl
{int bo;string name;struct st_girl* next; // 下一个超女节点的地址,如果本节点是最后一条记录,填nullptr
};

简单的链表操作
1.分配节点
2.遍历链表
3.删除链表

#include <iostream>         // 包含头文件。
#include <cstring>
using namespace std;        // 指定缺省的命名空间。struct st_girl
{int no;string name;      // 超女姓名。struct st_girl* next;
};int main()
{// head 头指针 tail 尾指针 tmp 临时指针st_girl* head = nullptr, *tail = nullptr, *tmp = nullptr;// 分配第一个节点tmp = new st_girl({1, "BigDavid", nullptr});head = tail = tmp;// 分配第二个节点tmp = new st_girl({6, "LiuXueJin", nullptr});tail->next = tmp;tail = tmp;// 分配第三个节点tmp = new st_girl({3, "as", nullptr});tail->next = tmp;tail = tmp;// 遍历链表tmp = head;while (tmp!=nullptr){cout << tmp->no << ' ' << tmp->name << tmp->next << endl;tmp = tmp->next;}// 释放while (head!=nullptr){tmp = head;       // 让临时节点指向头节点head = head->next;// 头节点后移delete tmp;       // 删除临时节点}
}
共同体

能存储不同数据类型,但同一时间只能存储一个

union udata
{int a;double b;char c[21];
};

应用场景:
(1)当数据项使用两种或多种格式(但不会同时使用),可节省空间(嵌入式系统)
(2)回调函数的参数

Tip:

  1. 共同体占用内存的大小是它最大的成员占用内存的大小(内存对齐)
  2. 全部成员共用一块内存
  3. 共同体中的值为最后被赋值的成员的值
  4. 匿名共同体没有名字,可以在定义的时候创建匿名共同体变量(VS和Linux有差别),也可以嵌入结构体中。
#include <iostream>         // 包含头文件。
#include <cstring>
using namespace std;        // 指定缺省的命名空间。//union udata
//{
//    int a;
//    double b;
//    char c[21];
//};struct st_girl
{int no;union{int a;double b;char c[21];};
};
int main()
{
//    udata data;//    cout << sizeof(data) << endl; // 24 对齐到8的整数倍
//    cout << (void*)&data.a << endl; // 0x8e5bfff820
//    cout << (void*)&data.b << endl; // 0x8e5bfff820
//    cout << (void*)&data.c << endl; // 0x8e5bfff820
//
//    data.a = 3;
//    data.b = 8.8;
//    strcpy(data.c, "asd");
//    cout << data.a << endl;
//    cout << data.b << endl;
//    cout << data.c << endl;struct st_girl girl;cout << (void*)&girl.no << endl;cout << (void*)&girl.a << endl;cout << (void*)&girl.b << endl;cout << (void*)&girl.c << endl;
}
枚举

枚举:创建符号常量
语法:
enum 枚举名 { 枚举量1, 枚举量2, 枚举量3, ... ,枚举量n };

// colors 成了一种新的枚举类型的名称,可以用它创建枚举变量
enum colors { red, yellow, blue }; // 0 1 2

枚举

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。int main()
{enum colors {red , yellow, green}; // 0 1 2colors cc = green; // 2// colors cc = colors(1);cout << red << ' ' << yellow << ' ' << green << ' ' << cc;
}

2 引用

2.1 引用基本概念

引用就是变量的别名
主要用途:函数的形参和返回值
语法:数据类型 &引用名 = 原变量名;
Tip:
(1)引用数据类型要与原变量名类型相同
(2)引用名和原变量名可以互换,值和内存单元是相同的
(3)必须在声名引用的时候初始化,否则编译报错

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。int main()
{int a = 3;int& ra = a; // 创建引用// long long& b = a; 错误的cout << a << ' ' << ra << endl;cout << &a << ' ' << &ra << endl; // 地址和值都是相同的ra = 8;cout << a << ' ' << ra << endl;cout << &a << ' ' << &ra << endl;int b = 5;ra = b; // ra = 5cout << &ra << ' ' << &b << endl;cout << a << ' ' << ra << endl;cout << &a << ' ' << &ra << endl;
}

引用是指针常量的伪装

2.2 引用用于函数的参数

把函数的形参声明为引用,调用函数的时候,形参将成为实参的别名(传引用)
最主要的用途:函数的参数
(1)传引用代码更简洁
(2)传引用不必使用二级指针
回顾二级指针

#include <stdio.h>int main()
{int a = 10;int b = 20;int *p = &a;int** s = &p;//一次解引用*s 此时类型int**s = &b;//二次解引用**s 此时类型int**s = 200;return 0;
}

二级指针s解引用操作:

一次解引用
s的类型变成了(int)(代表着一级指针p)间接改变了p的指向,从a的地址变成了b的地址;
二次解引用
s的类型变成了int (代表着变量b),此时s = 200;(等价于b = 200;)

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
void fun1(int** p)
{*p = new int(3);// p是二级指针,存放指针的地址cout << *p << ' ' << **p << endl; // 0x1b4b87218c0 3
}
void fun2(int* &p)
{p = new int(3); // p是指针的别名cout << p << ' ' << *p << endl; // 0x1b4b87218c0 3
}
int main()
{int *p = nullptr; // 存放子函数动态分配内存的地址fun1(&p);         // 传地址,实参填指针p的地址fun2(p);      // 传引用,实参填指针p
}

(3)引用的属性和特别之处

传值:修改形参不会影响实参
传地址:修改形参会影响实参
传引用:修改形参会影响实参

2.3 引用的形参和const

如果引用的数据对象类型不匹配,当引用为const,C++会创建临时变量,让引用指向临时变量
创建临时变量
(1)引用是const
(2)数据对象的类型是正确的,但不是左值

左值:可以被引用的数据对象,可以通过地址访问(变量,数组元素,结构体成员,引用和解引用的指针)
非左值:字面常量(双引号的字符串除外)和包含多项的表达式

(3)数据对象类型不正确,但可以转换为正确的类型
如果函数的实参不是左值或与const引用形参的类型不匹配,那么C++将创建正确类型的匿名变量,将实参的值传递给匿名变量,并让形参来引用该变量

引用形参声明为const原因:

  1. 避免无意修改数据的编程错误
  2. 用const能使函数处理const和非const实参,否则只能接受非const实参
  3. 使用const,函数能正确生成并使用临时变量
#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
void fun(const int& no, const string& str)
{cout << no << ' ' << str << endl;
}
int main()
{fun('s', "asd");int bh = 1;string a = "sadasd";fun(bh, a);
}
2.4 引用用于函数的返回值

函数的返回值被拷贝到一个临时位置(寄存器或栈)
如果返回引用不会拷贝内存
语法:返回值数据类型& 函数名(形参列表);
Tip:
(1)如果返回局部变量的引用,本质是野指针
(2)可以返回函数的引用形参、类的成员、全局变量、静态变量
(3)返回引用的函数是被引用的变量的别名,将const用于引用的返回类型

#include <iostream>
using namespace std;const int& fun(int &ra)
{ra++;cout << &ra << ' ' << ra << endl;return ra;
}int main()
{int a = 3;const int& b = fun(a);cout << &a << ' ' << &b << ' ' << endl;cout << a << ' ' << b << endl;//    fun(a) = 3; // 返回引用的函数是被引用变量的别名
}
2.5 各种形参的使用场景

重要
(1)如果不需要在函数中修改实参

  1. 如果实参很小,就值传递
  2. 如果实参是数组,用const指针,因为是唯一的选择(没有为数组建立引用)
  3. 实参是比较大的结构,使用const指针或const引用
  4. 如果实参是类,则使用const引用,传递类的标准方式是按引用传递

(2)如果需要在函数中修改实参

  1. 如果实参是内置数据类型,使用指针。只要看到fun(&x)的调用,表示函数将修改x
  2. 如果实参是数组,则只能使用指针
  3. 如果实参是结构体,则使用指针或者引用
  4. 如果实参是类,则使用引用

3 函数的默认参数

语法:返回值 函数名(数据类型 参数 = 值,数据类型 参数 = 值,...);

#include <iostream>
using namespace std;void fun(const string &message = "BigDavid")
{cout << message << endl;
}int main()
{fun("Liu");  // Liufun();               // BigDavid
}

Tip:
(1)函数的声明和定义分开写的,在函数的声名里写默认参数,函数的定义里不能写默认参数

#include <iostream>
using namespace std;void fun(const string &message = "BigDavid");
int main()
{fun("Liu");  // Liufun();               // BigDavid
}//void fun(const string &message = "BigDavid")
//{
//    cout << message << endl;
//}
void fun(const string &message)
{cout << message << endl;
}

(2)函数必须右到左设置默认参数。如果为某个参数设置默认值,则它后面所有的参数都设置默认值

#include <iostream>
using namespace std;void fun(int no, const string& name = "Big", int bh = 8)
{cout << no << ' ' << name << ' ' << bh << endl;
}int main()
{fun(1);
}

(3)调用函数的时候,如果指定某个参数的值,该参数前面的值都需要指定

#include <iostream>
using namespace std;void fun(int no, const string& name = "Big", int bh = 8)
{cout << no << ' ' << name << ' ' << bh << endl;
}int main()
{//fun(1,8);fun(1,"as");
}

4 函数重载

函数重载(函数多态)是指设计一系列同名函数,完成相似的工作
C++允许定义名称相同的函数,条件是特征不同

特征:形参个数,数据类型,排列顺序

int fun(short a, string b);
int fun(int a, int b);
int fun(short a, string b, double c);
int fun(string b, short a);

需求重载各种数据类型,不要重载功能不同的函数
注意事项:
(1)使用重载函数时,如果数据类型不匹配,C++尝试使用类型转换与形参进行匹配,如果转换后有多个函数能匹配上,编译将报错

void fun(short a, string b)
{cout << a << ' ' << b << endl;
}
void fun(int a, string b)
{	cout << a << ' ' << b << endl;
}
int main()
{long bh = 0;// 有多个函数能匹配上,编译将报错fun(bh,"sas");   // long->short 会丢失精度
}

(2)引用可以作为函数重载的条件,但是,调用重载函数的时候,如果实参是变量,编译器将形参类型的本身和类型引用视为同一特征

#include <iostream>
using namespace std;
void show(int bh, string a)
{cout << bh << ' ' << a << endl;
}
void show(int& bh, string a)
{cout << bh << ' ' << a << endl;
}
int main()
{int a = 0;show(a, "asd"); // 报错show(10, "sd");
}

(3)如果重载函数有默认参数,调用函数时,可能导致匹配失败

#include <iostream>
using namespace std;
void show(int bh, string a)
{cout << bh << ' ' << a << endl;
}
void show(int bh, string a, string c = "sad")
{cout << bh << ' ' << a << ' ' << c << endl;
}
int main()
{show(1,"asd");// 可能导致匹配失败
}

(4)const不能作为函数重载的特征

#include <iostream>
using namespace std;
void show(int bh, string a)
{cout << bh << ' ' << a << endl;
}
void show(const int bh, string a)
{cout << bh << ' ' << a << endl;
}
int main()
{show(1,"asd");// 报错,函数已有主体
}

(5)返回值的数据类型不同不能作为函数重载的特征
(6)C++的名称修饰:编译时,对每个函数名进行加密,替换成不同名的函数。

5 内联函数

用途:提高程序运行的速度
语法:在函数声名和定义前加上关键字inline
常见的做法是将函数声名和定义写在一起
Tip:
(1)内联函数节省时间,但消耗内存
(2)如果函数过大,编译器可能不将其作为内联函数
(3)内联函数不能递归

#include <iostream>
using namespace std;inline void show(const int bh, const string& message)
{cout << bh << ' ' << message << endl;
}int main()
{show(1,"sd");show(2, "qwe");show(4, "asaaa");
}

相关文章:

C++基础从0到1入门编程(三)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a; C基础从0到1入门编程&#xff08;一&#xff09; C基础从0到1入门编程&#xff08;二&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 2.系统…...

[Jenkins] 物理机 安装 Jenkins

这里介绍Linux CentOS系统直接Yum 安装 Jenkins&#xff0c;不同系统之间类似&#xff0c;操作命令差异&#xff0c;如&#xff1a;Ubuntu用apt&#xff1b; 0、安装 Jenkins Jenkins是一个基于Java语言开发的持续构建工具平台&#xff0c;主要用于持续、自动的构建/测试你的软…...

设计模式 -- 适配器模式(Adapter Pattern)

适配器模式&#xff1a;属于结构型模式&#xff0c;结合了两个独立接口的功能&#xff0c;作为 两个不兼容的接口之间的桥梁 。 介绍 意图&#xff1a;将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要…...

Axios传值的几种方式

<body><script src"https://unpkg.com/axios/dist/axios.min.js"></script></body> axios基本使用 默认是get请求 注意&#xff1a;get请求无请求体&#xff0c;可以有body,但是不建议带 使用get方式进行无参请求 <script>axios(…...

git pull 报错 error object file is empty , The remote end hung up unexpectedly

报错原因分析&#xff1a;git pull的时候服务器在重启&#xff0c;导致git文件损坏 方法来源&#xff1a; 解决git错误: error object file is empty , The remote end hung up unexpectedly-CSDN博客 亲测有效 find .git/objects/ -type f -empty | xargs rm git fetch -p…...

手机数码类展示预约小程序效果如何

对于一家手机数码/电脑品牌来说&#xff0c;研发产品或衍生产品不少&#xff0c;通常会通过线上商城进行售卖。十年以来&#xff0c;流量成本逐渐增加&#xff0c;获客不易也难以寻找到合适的渠道&#xff0c;即使通过广告形式也因缺乏创意而耗时耗力&#xff0c;效果不佳。 同…...

图神经网络:消息传递算法

一、说明 图网络-GNN&#xff08;Graph Neural Networks&#xff09;是近几年研究的主题之一&#xff0c;虽不及深度神经网络那么火爆&#xff0c;但在一些领域&#xff0c;如分子化学方面是不得不依赖的理论。本文就一些典型意义的图神经网络消息传递展开阐述。 二、图网络简述…...

安全+Linux!IBM新一代大型机Z14全新发布

导读本周&#xff0c;以“架构 人机同行”为主题的IBM Systems创行者高峰论坛在北京召开&#xff0c;IBM全球及大中华区硬件系统部负责人&#xff0c;金融、医疗、制造等领域的企业、合作伙伴共与这一年度盛会&#xff0c;探讨认知时代下的基础架构技术趋势及IBM硬件系统业务的…...

Java中的局部变量和成员变量的区别

局部变量和成员变量的区别 区别1&#xff1a;代码中位置不同 成员变量&#xff1a;类中方法外定义的变量 局部变量&#xff1a;方法中定义的变量 代码块中定义的变量 区别2&#xff1a;代码的作用范围 成员变量&#xff1a;当前类的很多方法 局部变量&#xff1a;当前一…...

基于C++实现循环赛日程表(分治算法)

一、问题描叙 设有n2^k个运动员&#xff0c;要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 每个选手必须与其他n-1个选手各赛一场每个选手一天只能赛一次循环赛一共进行n-1天 二、问题分析 按此要求可将比赛日程表设计成n行n-1列的表&#xff0c;在表中第 i 行…...

基于uni-app的汽车租赁app的设计与实现

1.项目背景及意义 项目背景&#xff1a; 随着人们生活水平的提高&#xff0c;汽车租赁服务在城市中变得越来越普及。传统的租车方式存在一些问题&#xff0c;比如租车流程繁琐、费用不透明、选择有限等。因此&#xff0c;开发一款基于uni-app的汽车租赁app成为了满足用户需求…...

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…...

Navicat 基于 GaussDB 主备版的快速入门

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…...

String的字符串拼接

java中 String a “123” “234”; String b “123”; String c b “234”; 其中a和c的区别是什么&#xff1f; a c 为什么为false 在Java中&#xff0c;字符串的处理特别是涉及到字符串常量和字符串变量的连接时&#xff0c;会涉及到字符串池&#xff08;String Pool&a…...

反渗透水处理成套设备有哪些

反渗透水处理成套设备主要包括反渗透装置、预处理系统、控制系统等部分。 反渗透装置&#xff1a;反渗透水处理设备的核心部分&#xff0c;由反渗透膜、压力容器、膜组件等组成。反渗透膜是一种高分子材料制成的半透膜&#xff0c;能够截留水中的溶解盐、有机物、细菌等杂质&a…...

DPC15 国产带有 SPI 接口的独立 CAN 控制器兼容替代MCP2551

DPC15是一款独立控制器局域网络&#xff08;Controller Area Network&#xff0c;CAN&#xff09;协议控制器&#xff0c;完全支持CAN V2.0B技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 DPC15自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报…...

【ELK01】ELK简介以及ElasticSearch安装、ES客户端工具-Head安装、报错问题整理

有一段时间没有更新这个专栏了,最近在用ELK相关的技术,今天开始写一下ELK的系列的内容,与大家共同学习 一、什么是ELK ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。 1. E-ELASTICS…...

根据音频绘制频谱

根据音频链接绘制频谱图 封装 // 可以这样使用 也可以 import { AudioContext } from standardized-audio-context; const getAudioContext window.AudioContext ||window.webkitAudioContext ||window.mozAudioContext ||window.msAudioContext;const clearArr []export c…...

SSL证书对网站SEO的好处

随着网络安全意识的提高&#xff0c;越来越多的网站开始采用SSL证书来保护自己的数据传输过程。那么&#xff0c;SSL证书真的能为网站SEO带来好处吗&#xff1f;下面将为您分析这个问题。 加强用户体验和信任度 SSL证书不仅能确保数据传输的安全性&#xff0c;还能让客户感受…...

YB506AB是一款理电池充、放电管理专用芯片,集成锂电池充电管理和降压DC-DC电路。

YB506AB 锂电转可充电AA/AAA电池专用SOC芯片 概述: YB506AB是一款理电池充、放电管理专用芯片&#xff0c;集成锂电池充电管理和降压DC-DC电路。充电过程满足锂电池三段式滑流/恒流/恒压充电规范&#xff0c;B506内部的线性充电电路采用了恒流可配置模式&#xff0c;可以通过…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...