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");
}

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

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

相关文章

微信小程序数据传递的方式-页面数据的存取

我们在把数据显示到页面的时候&#xff0c;为了实现良好的互动&#xff0c;都希望在用户点击某个栏目后&#xff0c;获取这个栏目的捆绑数据&#xff0c;然后执行后续的操作。 例如&#xff0c;从数据库里取出对应的记录后&#xff0c;显示在页面上&#xff0c;是一条条的大横条…

企业计算机服务器中了faust勒索病毒怎么办,faust勒索病毒解密文件恢复

网络技术的不断应用发展&#xff0c;为企业注入了新的生产运营方式&#xff0c;计算机服务器为企业的数据存储提供了便利&#xff0c;让企业的生产运营得到了有力保障&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了…

基于单片机设计的电子指南针(LSM303DLH模块(三轴磁场 + 三轴加速度)

一、前言 本项目是基于单片机设计的电子指南针&#xff0c;主要利用STC89C52作为主控芯片和LSM303DLH模块作为指南针模块。通过LCD1602液晶显示屏来展示检测到的指南针信息。 在日常生活中&#xff0c;指南针是一种非常实用的工具&#xff0c;可以帮助我们确定方向&#xff0…

人工智能-循环神经网络通过时间反向传播

到目前为止&#xff0c;我们已经反复提到像梯度爆炸或梯度消失&#xff0c; 以及需要对循环神经网络分离梯度。 例如&#xff0c;我们在序列上调用了detach函数。 为了能够快速构建模型并了解其工作原理&#xff0c; 上面所说的这些概念都没有得到充分的解释。 本节将更深入地探…

CDN的发展和作用。当前网站被攻击适用什么样的CDN。

随着互联网的高速发展&#xff0c;网络中也出现各种日新月异的DDOS攻击&#xff0c;让人防不甚防&#xff0c;在这样的环境下&#xff0c;网络安全的地位也就不断的上升和重视&#xff0c;其防护手段也是随着攻击的变化不停的升级更新&#xff0c;从事这一行业多年&#xff0c;…

MTK Pump Express 快速充电原理分析

1 MTK PE 1.1 原理 在讲正文之前&#xff0c;我们先看一个例子。 对于一块电池&#xff0c;我们假设它的容量是6000mAh&#xff0c;并且标称电压是3.7V&#xff0c;换算成Wh(瓦时)为单位的值是22.3Wh(6000mAh*3.7V)&#xff1b;普通的充电器输出电压电流是5V2A(10W)&#xff0c…

纯CSS实现炫酷文本阴影效果

如图所示&#xff0c;这是一个文本阴影效果&#xff0c;阴影有多个颜色&#xff0c;鼠标悬停时文本阴影效果消失&#xff0c;文本回到正常的效果。让我们逐步分解代码&#xff0c;看看如何使用纯CSS实现这个效果的。 基于以上动图可以分析出以下是本次实现的主要几个功能点&am…

【软件工程师从0到1】- Java面向对象基础 (知识汇总)

前言 介绍&#xff1a;大家好啊&#xff0c;我是hitzaki辰。 社区&#xff1a;&#xff08;完全免费、欢迎加入&#xff09;日常打卡、学习交流、资源共享的知识星球。 自媒体&#xff1a;我会在b站/抖音更新视频讲解 或 一些纯技术外的分享&#xff0c;账号同名&#xff1a;hi…

QTcpSocket发送结构体的做法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> QTcpSocket发送结构体其实很简单:使用QByteArray类对象进行封装发送&#xff0c;示例代码如下&#xff1a; /* 消息结构体 */ struct stMsg {int m_A…

【bugfix】安装 flash-attn 报错

目录 1. 报错信息 2. 解决方法 安装 flash attention 报错 1. 报错信息 Building wheel for flash-attn (setup.py) ... error error: subprocess-exited-with-error 或者 Building wheel for flash-attn (pyproject.toml) did not run successfully 甚至更多问题。 2. 解…

CLIP浅谈

CLIP论文地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP代码地址&#xff1a;https://github.com/openai/CLIP 简介 CLIP是OpenAI在2021年2月发表的一篇文章&#xff0c;它的主要贡献有以下2点&#xff1a; 1&#xff09;将图…

4、FFmpeg命令行操作7

转封装(1) 保持编码格式&#xff1a; ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts ffmpeg -i test.mp4 -codec copy test_copy2.ts 改变编码格式&#xff1a; ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv …

无损音频播放软件 Colibri mac中文版特点介绍

Colibri for mac是一款轻量级的音频播放器软件。它具有简洁的界面设计和快速启动速度&#xff0c;能够提供流畅的音频播放体验。Colibri支持多种常见的音频格式&#xff0c;包括MP3、FLAC、ALAC、AAC等。它还提供了一些实用的功能&#xff0c;如音频均衡器、音频增益控制、播放…

酒糟废水处理设备有哪些

酒糟废水处理设备有以下几种&#xff1a; 格栅&#xff1a;用于拦截大颗粒悬浮物&#xff0c;以保护后续处理设备。调节池&#xff1a;用于调节水质和水量&#xff0c;使废水在处理过程中保持稳定。混凝反应池&#xff1a;通过添加混凝剂&#xff0c;使废水中的小颗粒悬浮物凝…

小程序开通电子发票

总目录 文章目录 总目录前言结语 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 首先登录商户号&#xff1a;https://pay.weixin.qq.com/index.php/core/home/lo…

探索SPI:深入理解原理、源码与应用场景

文章目录 一、初步认识1、概念2、工作原理3、作用场景 二、源码分析1、ServiceLoader结构2、相关字段3、核心方法 三、案例connector连接器小案例1、新建SPI项目2、创建扩展实现项目1-MongoDB3、创建扩展实现项目2-Oracle4、测试 Spring应用1、创建study工程2、创建forlan-test…

uniapp Android如何授权打开系统蓝牙Bluetooth?

uniapp Android如何授权打开系统蓝牙&#xff1f; 使用uniapp开发蓝牙项目过程中&#xff0c;涉及到检测手机系统蓝牙是否打开功能&#xff0c;这里介绍Android&#xff0c;iOS暂时没有找到优方法。朋友们如果有好的方案&#xff0c;欢迎评论分享~ 文章目录 uniapp Android如何…

AWS云服务器EC2实例实现ByConity快速部署

1. 前言 亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在全球范围内都备受推崇&#xff0c;被众多业内人士誉为“云计算服务的行业标准”。在国内&#xff0c;亚马逊AWS也以其卓越的性能和服务满足了众多用户的需求&#xff0c;拥有着较高的市场份额和竞争力。…

华为笔记本MateBook D 14 2021款锐龙版R7集显非触屏(NbM-WFP9)原装出厂Windows10-20H2系统

链接&#xff1a;https://pan.baidu.com/s/13Kyy95GME-asli4woNN_ww?pwdbqa8 提取码&#xff1a;bqa8 HUAWEI华为MateBookD14原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为电脑管家等预装程序

网络营销人员提问常用的ChatGPT通用提示词模板

如何制定有效的网络营销策略和计划&#xff1f; 如何运用社交媒体进行网络营销和推广&#xff1f; 网络营销中的搜索引擎优化&#xff08;SEO&#xff09;有哪些技巧和最佳实践&#xff1f; 如何运用电子邮件营销和网络广告来推广产品或服务&#xff1f; 网络营销中的数据分…