C++入门(未完待续)
1.命名空间
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员
①.普通的命名空间
namespace N1{//命名空间的内容,既可以定义变量,又可以定义函数
int a;
int Add(int left,int right){
return left+right;
}
}
②.命名空间可以嵌套
namespace N1{//命名空间的内容,既可以定义变量,又可以定义函数
int a;
int Add(int left,int right){
return left+right;
}
namespace N3{
int c;
int d;
int sub(int left,int right){
return left-right;
}
}
③.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
命名空间的使用
①.加命名空间名称和域作用限定符
int main(){
printf("%d",N::a);
return 0;
}
②.使用using将命名空间中成员引入
using N::b
int main(){
pritnf("%d",N::b);
return 0;
}
③.使用using namespace 命名空间名称引入
using namespace N;
using namespace N;//全部展开,全部授权
using N::add;//部分展开,部分授权
using namespace std;
std是c++标准库的命名空间
2.c++输入/输出
<<流插入运算符
流提取运算符
cout<<"hello world"<<endl;
endl为换行符
cout<<"hello world"<<"\n";
两者效果相同
使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含头文件以及std标准命名空间
使用c++输入输出更加方便,不需增加数据控制格式,比如整形"%d” 字符"%c"
注意cin的特点,与c语言中gets有些类似,gets是遇到换行符停止,而cin是遇到空格,tab或者换行符作为分隔符的,
char arr[20]={};
cin>>arr;
输入hello world 但由于中间存在空格,故arr这个数组中只有hello,没有world
3.缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
void func(int a=10){
cout<<a<<endl;
}
int main(){
func();//没有传参时,使用参数的默认值
func(10);//传参时,使用指定的实参
}
分类
全缺省参数
void func(int a=10;int b=20;int c=30){}
半缺省参数
void func(int a,int b=20;int c=30){}
注意①.半缺省参数必须从右往左依次来给,不能间隔着给
②.缺省参数不能在函数的声明和定义中同时出现
因为如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用哪个缺省值
声明不给定义给
③.缺省值必须是常量或者全局变量
//正确示例
int x = 3;//全局变量
void func(int a, int b = 2, int c = x)
{cout << a << endl;cout << b << endl;cout << c << endl;
}
4.函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的
形参列表(参数个数 或类型或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
#include <iostream>
using namespace std;int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}
int main()
{cout << Add(0,1) << endl;//打印0+1的结果cout << Add(1.1,2.2) << endl;//打印1.1+2.2的结果return 0;
}
注意:若仅仅只有返回值不同,其他都相同,则不构成函数重载。
c语言与c++类似,都要进行编译和链接两个过程
编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址实在b.o中
链接器看到a.o调用Add,但没有Add的地址,就会到b.o的符号表(符号表就是函数名,变量跟地址的映射)中去找Add的地址,然后链接到一起。面对多个Add函数,每个编译器有自己的修饰规则,在gcc下的修饰规则是:【_Z+函数长度+函数名+类型首字母】。
之所以c语言无法支持重载,是因为C编译器和C++编译器对函数名的修饰不同
所以,返回值的不会构成函数重载,因为修饰规则并不会受返回值的影响。
如果函数名修饰规则带入返回值,返回值能否构成重载?
不能,因为不知道要调用谁
5.引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它
引用的变量共用同一块内存空间。
类型& 引用变量名(对象名) = 引用实体;
int a=10;
int&b=a; //相当于给a取了一个别名,给b引用了a,同一个变量取了个名字
b=3;//改变b也就相当于改变a了
引用类型必须和引用实体是同种类型的
引用的特性
①.引用在定义时必须初始化
//正确示例
int a = 10;
int& b = a;//引用在定义时必须初始化
//错误示例
int a = 10;
int &b;//定义时未初始化
b = a;
②.一个变量可以有多个引用
int a = 10;
int& b = a;
int& c = a;
int& d = a;
③.引用一旦引用了一个实体,就不能再引用其他实体(c++的引用不能改变指向)
int a = 10;
int& b = a;
int c = 20;
b = c;//错误,b已经引用了a,就不能在引用c
实际效果变为,b的值变为20,而因为a与b相同,故a的值也变成了20
常引用
在引用的过程中,权限可以平移,可以缩小,但不能放大
const int a=10;
int&b=a;
会出现错误,相当于权限的放大,因为在这里a为常量,如果用int&b=a;那么,b可以修改,但a不可以修改
const int&ra=a;
相当于权限的平移,不会出错
int&b=10;
会出现错误,b为常量,需要改为
const int&b=10;
int i=0;
double&d=i;
会出现错误,因为发生类型转换时会产生一个double类型临时变量,临时变量具有常性
(int到double存在隐式类型的提升,而在提升的过程中系统会创建一个常量区来存放a类型提升后的结果)
需要改为
int i=0;
const double&d=i;
int func(){
int a=0;
return a;
}
int&ret=func();
会出现问题,因为func的返回值是a的一份临时拷贝,临时变量具有常性
需改成
const int&ret=func();
引用的使用场景
①.做参数
void swap(int&left,int&right){
int temp=left;
left=right;
right=temp;
}
②.做返回值
当然引用也能做返回值,但是要特别注意,我们返回的数据不能是函数内部创建的普通局部变量,因为在函数内部定义的普通的局部变量会随着函数调用的结束而被销毁。我们返回的数据必须是被static修饰或者是动态开辟的或者是全局变量等不会随着函数调用的结束而被销毁的数据。
int& count(){int n=0;n++;return n;
}
int main(){int ret=count();return 0;
}
count函数返回n的别名,但是n已经销毁,如果栈帧没有清楚,那么结果为1,否则结果为随机值
#include<iostream>
using namespace std;
int&Add(int a,int b){int c=a+b;return c;
}
int main(){int&ans=Add(1,2);Add(3,4);cout<<ans<<endl;
}
但如果再加上一句cout<<ans<<endl;打印出的结果将变为随机值
因为在第一次调用cout<<ans<<endl时,函数传参建立栈帧,调用完后被覆盖,第二次调用时已经被覆盖,为随机值
#include<iostream>
using namespace std;
int& Add(int a, int b)
{static int c = a + b;return c;
}int main()
{int& ans = Add(1,2);Add(3, 4);cout << ans << endl;
}
为什么会出现随机值,因为你在函数里定义的变量是临时变量,出了函数函数是会销毁的,这时它就随机指向内存中的一块空间了。所以在引用做函数返回值时最好还是给在函数中定义的变量加上static。加上static后,结果将变为3。
因为第二次调用Add函数时,static int c=a+b;并不会执行,而是直接return c;
但如果将该函数修改为
int& Add(int a, int b)
{static int c ;c=a+b;return c;
}
总结:
传引用传参(任何时候都可以)
①.提高效率
②.输出型参数(形参的修改影响实参)
传引用返回(出了函数作用域对象还在才可以用)
①.提高效率
②.
顺序表查找和修改可以用一个函数来解决
int& SLAT(struct seqlist&ps,int i){
return ps.a[i];
}
想要修改SLAT(s,0)=1;
相关文章:
C++入门(未完待续)
1.命名空间 使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员 ①.普通的命名空间 n…...
Python爬虫学习笔记(四)————XPath解析
目录 0.xpath最新下载地址和安装教程 1.xpath安装 2.xpath基本使用 3.xpath基本语法 4.实例 (1)xpath解析本地文件 (2)xpath解析服务器响应的数据 ①获取百度网站的“百度一下”四个字 ②获取站长素材网站情侣图片前十页的…...
知识图谱推理的学习逻辑规则(上)
知识图谱推理的学习逻辑规则 摘要介绍相关工作模型知识图谱推理逻辑规则概率形式化参数化优化 实验实验设置实验结果 结论 原文: 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则。 逻辑规则用于预测时提供了可解释性并且可以推广到其他任务中,因…...
【从零开始学习C++ | 第二十一篇】C++新增特性 (上)
目录 前言: 委托构造函数: 类内初始化: 空指针: 枚举类: 总结: 前言: C的学习难度大,内容繁多。因此我们要及时掌握C的各种特性,因此我们更新本篇文章,向…...
你真的会用async和await么?
背景 背景就是遇到了一个比较烦人的模块,里面的涉及到了大量的async 和 awiat。发现大多人对这个语法糖一知半解,然后大量的滥用,整理一下 async 前置知识: Promise.resolve(foo) new Promise(resolve > resolve(foo)…...
vscode远程连接提示:过程试图写入的管道不存在(删除C:\Users\<用户名>\.ssh\known_hosts然后重新连接)
文章目录 复现过程原因解决方法总结 复现过程 我是在windows上用vscode远程连接到我的ubuntu虚拟机上,后来我的虚拟机出了点问题,我把它回退了,然后再连接就出现了这个问题 原因 本地的known_hosts文件记录服务器信息与现服务器的信息冲突了…...
【005】基于深度学习的图像语 通信系统
摘要 语义通信是一种新颖的通信方式,可通过传输数据的语义信息提高带宽效率。提出一种用于无线图像传输的系统。该系统基于深度学习技术开发并以端到端(E2E)的方式进行训练。利用深度学习实现语义特征的提取和重建,在发送端提取信…...
基于ssm的社区生活超市的设计与实现
博主介绍:专注于Java技术领域和毕业项目实战。专注于计算机毕设开发、定制、文档编写指导等,对软件开发具有浓厚的兴趣,工作之余喜欢钻研技术,关注IT技术的发展趋势,感谢大家的关注与支持。 技术交流和部署相关看文章…...
长短期记忆网络(LSTM)原理解析
长短期记忆网络(Long Short-Term Memory,简称LSTM)是一种常用于处理序列数据的深度学习模型。它在循环神经网络(Recurrent Neural Network,RNN)的基础上进行了改进,旨在解决传统RNN中的梯度消失…...
vscode debug的方式
在.vscode文件夹下建立launch.json 例子1:调试python 来自 https://github.com/chunleili/tiPBD/tree/amg {"version": "0.2.0","configurations": [{"name": "hpbd 5 5","type": "python&quo…...
微信加粉计数器后台开发
后台包括管理后台与代理后台两部分 管理后台 管理后台自带网络验证卡密系统,一个后台可以完成对Pc端的全部对接,可以自定义修改分组名称 分享等等代理后台 分享页 调用示例 <?php$request new HttpRequest(); $request->setUrl(http://xxxxxxx/api); $request->…...
黑客是什么?想成为黑客需要学习什么?
什么是黑客 在《黑客辞典》里有不少关于“黑客”的定义, 大多和“精于技术”或“乐于解决问题并超越极限”之类的形容相关。然而,若你想知道如何成为一名黑客,只要牢记两点即可。 这是一个社区和一种共享文化,可追溯到那群数十年前使…...
iOS中__attribute__的使用
通过__attribute编译期指令将数据注册至Mach-O指定段的section,可以提供更灵活的注册方式,避免了非必要依赖。通过这种方式不仅仅能够在任何地方注册string,甚至可以注册C函数。 下面的库提供了注册和读取内容的简单方式,主要支持…...
腾讯、飞书等在线表格自动化编辑--python
编辑在线表格 一 目的二 实现效果三 实现过程简介1、本地操作表格之后进入导入在线文档2、直接操作在线文档 四 实现步骤讲解1、实现方法的选择2、导入类库3、设置浏览器代理直接操作已打开浏览器4、在线文档登录5、在线文档表格数据操作6、行数不够自动添加行数 五 代码实现小…...
开源库nlohmann json使用备忘
nlohmann/json是一个用于解析JSON的开源C库,口碑一流,无需额外安装其他第三方库,还支持单个头文件模式,使用起来非常方便直观。 1. 编译 从官网https://github.com/nlohmann/json的Release页面下载单个json.hpp即可直接使用&…...
语音识别开源框架 openAI-whisper
Whisper 是一种通用的语音识别模型。 它是OpenAI于2022年9月份开源的在各种音频的大型数据集上训练的语音识别模型,也是一个可以执行多语言语音识别、语音翻译和语言识别的多任务模型。 GitHub - yeyupiaoling/Whisper-Finetune: 微调Whisper语音识别模型和加速推理…...
php做的中秋博饼游戏之绘制骰子图案功能示例
先看代码 header(Content-Type:image/png); $img imagecreatetruecolor(200, 200); $white imagecolorallocate($img, 255, 255, 255); $grey imagecolorallocate($img, 100, 100, 100); $blue imagecolorallocate($img, 0, 102, 255); $red imagecolorallocate($img, …...
erlang 虚拟机优化参数
sbwt none 将CPU忙等待关闭将有助于降低系统显示的CPU使用率,因为开启了忙等待的BEAM,CPU负载并不代表真实的工作情况; K true 开启epoll IO模型 swt low Sets scheduler wakeup threshold. Defaults to medium. The thresh…...
网络安全能力成熟度模型介绍
一、概述 经过多年网络安全工作,一直缺乏网络安全的整体视角,网络安全的全貌到底是什么,一直挺迷惑的。目前网络安全的分类和厂家非常多,而且每年还会冒出来不少新的产品。但这些产品感觉还是像盲人摸象,只看到网络安…...
python爬虫试手
同事让帮忙在某个网站爬点数据,首次尝试爬虫,遇到的问题及解决思路记录下。 大体需求是需要爬取详情页内的信息,详情页有一定格式规律,但是详情页需要从列表页跳入,列表页中的每一条记录需要鼠标悬停才会弹出跳转链接…...
OpenCore辅助工具(OCAT)全攻略:从配置到优化的黑苹果必备工具
OpenCore辅助工具(OCAT)全攻略:从配置到优化的黑苹果必备工具 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 核心价值&…...
联想ThinkPad声卡驱动安装避坑指南:从E470到X1 Carbon的通用解法
ThinkPad声卡驱动安装全攻略:从型号识别到疑难排解 ThinkPad作为商务笔记本的代表,其稳定性和兼容性一直备受推崇。但即便是这样成熟的产品线,声卡驱动问题依然困扰着不少用户——从经典的E470到高端的X1 Carbon,不同机型可能面临…...
LxgwWenkaiGB:合规开源字体的专业应用指南
LxgwWenkaiGB:合规开源字体的专业应用指南 【免费下载链接】LxgwWenkaiGB An open-source Simplified Chinese font derived from Klee One. 项目地址: https://gitcode.com/gh_mirrors/lx/LxgwWenkaiGB LxgwWenkaiGB(霞鹜文楷 GB)作为…...
Uvicorn与Couchbase Analytics Service集成:构建高性能数据分析API的终极指南
Uvicorn与Couchbase Analytics Service集成:构建高性能数据分析API的终极指南 【免费下载链接】uvicorn An ASGI web server, for Python. 🦄 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn 在现代数据驱动的应用开发中,…...
基于MATLAB的平移线扫激光三维重建完整方案与代码实现
现整理了一套完整的,平移线扫重建 matlab代码和方案,包含相机标定、光平面标定与方案、移动装置标定与方案、激光线条中心线自适应提取、畸变矫正、三维重建、点云滤波等部分,代码按模块编写,注释完整,附带一份完整苹果…...
5大维度重构Windows体验:开源系统优化方案全解析
5大维度重构Windows体验:开源系统优化方案全解析 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atl…...
Virtuoso ADE仿真避坑指南:你的时钟占空比测对了吗?详解dutyCycle函数threshold参数设置
Virtuoso ADE仿真避坑指南:时钟占空比测量的关键参数解析 在模拟电路设计中,时钟信号的占空比精度往往直接影响系统性能。许多工程师虽然熟悉Virtuoso ADE的基础操作,却在自动测量占空比时遭遇"数据看起来合理但实际存在偏差"的困境…...
PromptTemplate和ChatPromptTemplate的区别是什么呢?
我用最简单、最直白、一看就懂的方式给你讲清楚: PromptTemplate 和 ChatPromptTemplate 的真正区别 一句话总结 PromptTemplate 生成一段普通字符串 给补全模型/简单模型用ChatPromptTemplate 生成一整段聊天对话格式 给**聊天模型(ChatGLM、Qwen、GP…...
效率飙升:用快马平台一键生成项目模板,告别重复的vscode环境配置
作为一个经常需要在新设备上配置开发环境的前端开发者,我深刻体会到重复搭建项目的痛苦。每次换电脑或者开新项目,都要从头安装VSCode插件、配置构建工具、集成UI库……这些琐碎工作至少会浪费半小时。最近发现InsCode(快马)平台能完美解决这个问题&…...
手把手教你为i.MX6ULL开发板适配非标准分辨率LCD(以1024x600 OV5640为例)
i.MX6ULL开发板非标准分辨率LCD适配实战:从寄存器配置到图像稳定输出 在嵌入式视觉系统开发中,摄像头与显示设备的适配往往成为项目落地的关键瓶颈。当面对非标准分辨率的LCD屏幕时,开发者需要深入理解图像采集与显示的全链路原理,…...
