C++(3)C++对C的扩展Extension
类型增强
1、类型更加严格
不初始化,无法通过编译;C不初始化,则随机赋值
#include <iostream>
#include <stdlib.h>int main()
{const int a = 100; //真正的const,无法修改
// int *p = &a; 报错const int *p = &a;char *p = (char)malloc(100); //malloc 得到的是void *return 0;
}
C++不喜欢指针和强制类型转换
2、增加bool类型(其实是增加了枚举)
C语言中表示真假,用0和非0
string s;
bool b = true / false;
enum BOOL{ FALSE, TRUE};
BOOL a = FALSE;
3、枚举等价关系
#define Spr 0
#define Sum 1 宏enum
{Spr=1, Sum, ...
};
C++中尽量不用宏,能用枚举代替就用枚举
输入与输出
C语义中,表达式不能赋值
#include <stdio.h>int main()
{int a, b = 5;a = b = 100;(a = b) = 100; //100是对a的赋值 C语言中报错printf("a = %d b = %d", a, b);return 0;
};
C++表达式可以赋值
#include <iostream>int main()
{int a, b = 10;a = b = 100;printf("a = %d b= %d\n", a, b);(a != b ? a : b) = 1000; //输出a=100, b=1000 return 0;
}
输入与输出
# include <iostream>using namespace std;//cin cout 类对象,scanf sprinf 相同的功能,函数int main()
{//char name[30];//scanf("%s", name); //不安全 超过30个字符会崩溃//gets(name); //不关心溢出问题,不安全// 键盘中的输入流入到name中//cin>>name; // >> 流输入运算符(重载 也代表右移) 超过30个字符会崩溃string name; //安全 从语言层规定cin>>name;cout<<"name="<<name<<endl;//"name=" name endl 均流入到cout中,等价于一个一个赋值cout<<"name="<<name<<endl;printf("name = %s\n", name);return 0;
}
# include <iostream>
# include <iomanip>using namespace std;int main()
{//C++ 不受空格控制int a = 12345; int b = 1234.567;cin>>a>>b; // cin>>a cin>>bcout<<a<<b<<endl; //endl \ncout<<setw(8)<<a<<endl; //引入头文件 iomanipcout<<setiosflags(ios::left)<<setw(8)<<a<<endl; //左对齐cout<<b<<endl; //输出两位小数点return 0;
}
函数重载
# include <iostream>//函数重载(静多态)
// 函数名相同,参数列表不同 类型 个数 顺序
int abs(int data)
{return data>0?data:-data;
}float abs(float data)
{return data>0?data:-data;
}int main()
{float ret = abs(-5.5f); //ambiguous 二义性cout<<ret<<endl;int ret2 = abs(5);cout<<ret2<<endl;return 0;
}
匹配原则:
1、严格匹配,找到则调用;2、通过隐式转换寻求一个匹配,找到则调用.
倾轧技术
C++ 完全兼容 C (语法、标准lib库 不会参加倾轧)string.h stdlib.h stdio.h
C++函数重载底层实现原理是C++利用name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数
C++命名倾轧的函数是无法被C语言调用的。C++的函数必须是没有倾轧的才能调用。 使用声明extern "C"的函数会禁止命名倾轧,这样C++的函数就可以被C语言调用。
str.cpp
#include <iostream>int mystrlen(char *p)
{int len = 0;while(*p){len++;p++;}return 0;
}
str.h 头文件
#ifndef STR_H
#define STR_Hint mystrlen(char *p);// extern "C" int mystrlen(char *p);#endif //STR_H
main.cpp
#include <iostream>
#include "str.h"using namespace std;int main()
{int n = mystrlen("china");cout<<n<<endl;return 0;
}
操作符重载Operator Overload
C++认为一切操作符都是函数。函数是可以重载的(并不是所有的运算符都可以重载)。
#include <iostream>
using namespace std;struct Complex //结构体 复数
{float real;float image;
};Complex operator+(Complex a, Complex b)
{Complex c;c.real = a.real + b.real;c.image = a.image + b.image;return c;
}int main()
{int a = 1; int b = 2;int c = a + b;cout << "c: " << c << endl;Complex aa = {1, 2}, bb = {2, 3};Complex cc = aa + bb; // 报错--增加了operator+,可执行Complex cc = operator+(aa, bb); //可执行cout<<"c = "<<"("<<c.real<<","<<c.image<<")"<<endl;return 0;
}
默认参数default parameters
#include <iostream>
#include <time.h>using namespace std;void weatherCast(string w = "pm2.5")
{time_t t = time(0); //170,0,0,0char tmp[64];strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A ", localtime(&t) );cout<<tmp<<"today is weather "<<w<<endl;
}//从右向左默认,中间不能跳跃
//实参的个数+默认参数的个数 >= 形参的个数
int volume(int l, int w, int h=5)
{return l*w*h;
}int main()
{weatherCast();weatherCast();weatherCast("sunshine");cout<<volume(1, 2)<<endl;cout<<volume(1, 2, 10)<<endl;return 0;
}
include <iostream>using namespace std;//void print(int a)
//{
// printf("void print(int a)\n");
//}void print(int a, int b = 10)
{print("void print(int a, int b = 10)\n");
}int main()
{print(1, 20); // 1个参数或2个参数的形式,重载,默认参数都可以实现,但是不可同时存在return 0;
}
引用Reference
- 引用是一种声明关系,声明的时候必须要初始化。引用不开辟空间,不分配内存。
- 此种声明关系,一经声明,不可变更。
- 可以对引用再次引用。多次引用的结果是多个引用指向同一个地址。
- 引用必须与原类型保持一致。
#include <iostream>using namespace std;int main()
{int a = 500; //变量名实质是一段内存空间的别名//*(int *)0xb0002345 = 500;int& ra = a; // 声明 ra 是a的引用(别名)printf("sizeof(a) = %d, sizeof(ra) = %d\n", sizeof(a), sizeof(ra));printf("&a = %p &ra = %p", &a, &ra);a = 100;printf("a = %d ra = %d\n", a, ra);ra = 2000;printf("a = %d ra = %d\n", a, ra);int b = 200;ra = b; // 赋值int &ra = b; //声明int& rr = ra; //再次引用printf("a = %d ra = %d rr = %d\n", a, ra, rr);return 0;
}
#include <iostream>
using namespace std;void swap(int *pa, int *pb)
{*pa ^= *pb;*pb ^= *pa;*pa ^= *pb;
}void swap(int &ra, int &rb)
{ra ^= rb;rb ^= ra;ra ^= rb;
}//平级内解决问题,然后不开辟多余的空间
//引用的目的是对指针的再次包装。指针是有引用的,但不应该有引用的指针。
void swap(char* &p, char* &q)
{char *t = q;q = p;p = t;
}int main()
{int a = 5; int b = 3;swap(a, b);cout<<"a= "<<a<<" b= "<<b<<endl;char *p = "china"; // 定义指针的引用 char* & rp = pchar *q = "america";cout<<"p = "<<p<<" q = "<<q<<endl;swap(p, q);cout<<"p = "<<p<<" q = "<<q<<endl; return 0;
}
避免C语言指针的缺陷,不能定义引用的引用,但可以定义指针的指针(二级指针)
#include <iostream>
using namespace std;int main()
{int a;int * p = &a; //定义指针int **pp = &p; //定义指针的指针(二级指针)int b;int &rb = b; //定义引用int * &rp = p; //定义指针的引用//报错,不能定义引用的引用int & & rrp = rp; ❌//不能定义引用的指针,引用就是对指针的包装,不希望再打开int& * p = &rb; ❌int x, y, z;int * p[] = {&x, &y, &z} //可以建立指针的数组int & rp [] = {x, y, z}; ❌ //不可以定义引用数组 rp int& *return 0;
}
数组引用
int arr[]= {1, 2, 3, 4, 5};
int(&rarr)[5] = arr;
常引用
- const对象的引用必须是const的,将普通引用绑定到const对象是不合法的
- const引用可使用相关类型的对象(常量、非同类型的变量或表达式)初始化
const int a = 100;
const int &ra = a;
int a;
const double & ra = a + 5;
先定义了 double tmp = a 然后定义 const double rb = tmp
use const whatever possible原因:
- 使用const可以避免无意修改数据的编程错误
- 使用const可以处理const和非const实参,否则只能接受非const数据
- 使用const引用,可使函数能够正确的生成并使用临时变量(如果实参与引用参数不匹配,就会生成临时变量)
相关文章:
C++(3)C++对C的扩展Extension
类型增强 1、类型更加严格 不初始化,无法通过编译;C不初始化,则随机赋值 #include <iostream> #include <stdlib.h>int main() {const int a 100; //真正的const,无法修改 // int *p &a; 报错const int *p…...
在vscode(idea)使用GitHub账号、Copilot异常
在idea使用GitHub账号、Copilot异常 登录GitHub显示 Invalid authentication data.Connection refused: connect或者副驾驶显示 Failed to initiate the GitHub login process. Please try again.一般网上的方法推荐使用token登录,或者降级副驾驶 经过研究&#x…...

新的后端渲染:服务器驱动UI
通过API发送UI是一种彻底的新方法,将改变传统的UI开发。 一项正在改变我们对用户界面 (UI) 的看法的技术是通过 API 发送 UI,也称为服务器驱动UI。这种方法提供了新水平的活力和灵活性,正在改变 UI 开发的传统范例。 服务器驱动 UI 不仅仅是…...

Postman如何做接口自动化测试?
前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码,属于一种软件开发工作,已经开发完…...

excel文本函数篇2
本期主要介绍LEN、FIND、SEARCH以及后面加B的情况: (1)后缀没有B:一个字节代表一个中文字符 (2)后缀有B:两个字节代表一个中文字符 1、LEN(text):返回文本字符串中的字符个数 2、…...

【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别
目录 一、MyBatis动态sql 1.1 动态sql的作用 1.2 动态sql作用论证 1.2.1 条件判断:<if> 1.2.2 循环迭代:<foreach> 1.2.3 SQL片段重用 1.2.4 动态条件组合:<choose><when><otherwise> 1.2.5 <where…...

什么是BEM命名规范?为什么要使用BEM命名规范?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范⭐ 为什么使用BEM命名规范?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为…...

JavaScript:交集和差集的应用场景
在集合A和集合B中,属于集合A,同时也属于集合B的元素组成的集合,就是交集。 在A中所有不属于集合B元素,组合成集合,就是差集。 那么在平时的开发中,如何使用差集和交集来解决问题呢? 现在有这…...

达梦数据库表空间创建和管理
概述 本文将介绍在达梦数据库如何创建和管理表空间。 1.创建表空间 1.1表空间个数限制 理论上最多允许有65535个表空间,但用户允许创建的表空间 ID 取值范围为0~32767, 超过 32767 的只允许系统使用,ID 由系统自动分配,ID不能…...

三、MySQL 数据库安装集
一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…...

【BASH】回顾与知识点梳理(三十九)
【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…...

蓝蓝设计-UI设计公司案例-HMI列车监控系统界面设计解决方案
2013年,为加拿大庞巴迪(Bombardier)设计列车监控系统界面设计。 2015-至今,为中车集团旗下若干公司提供HMI列车监控系统界面设计,综合考虑中车特点、城轨车、动车组的不同需求以及HMI硬键屏和触摸 屏的不同操作方式,重构框架设计、交互设计、…...

Blazor前后端框架Known-V1.2.13
V1.2.13 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行。 Gitee: https://gitee.com/known/KnownGithub:https://github.com/known/Known 概述 基于C#和Blazo…...
vue 复制文本
一个常用的库就是 clipboard.js,它可以帮助您实现跨浏览器的复制到剪贴板功能 首先,安装 clipboard.js: cnpm install clipboard 创建一个 Vue 组件并使用 clipboard.js: <template><div><input v-model"…...

西瓜书第三章
广义线性模型 考虑单点可微函数 g ( ⋅ ) g(\cdot) g(⋅),令 y g − 1 ( ω T x b ) yg^{-1}(\omega^{T}xb) yg−1(ωTxb),这样得到的模型称为“广义线性模型”,其中函数 g ( ⋅ ) g(\cdot) g(⋅)称为“联系函数”。显然,对数线…...
关于python如何使用sqlalchemy连接sap_hana数据库
1.先安装sqlalchemy pip install sqlalchemy 2.from sqlalchemy import create_engine 3.创建数据库连接方式: 假设数据连接方式如下: usernameH_TEOPT passwordww122222 jdbcUrljdbc:sap://192.163.1.161:21681/?currentschema 那么使用sqlalchemy 的…...
微信小程序教学系列(5)
微信小程序教学系列 第五章:小程序发布与推广 第一节:小程序发布流程介绍 小伙伴们,欢迎来到第五章的教学啦!在这一章中,我们将一起来探索小程序的发布与推广流程。你准备好了吗?让我们开始吧࿰…...

【计算机网络篇】TCP协议
✅作者简介:大家好,我是小杨 📃个人主页:「小杨」的csdn博客 🐳希望大家多多支持🥰一起进步呀! TCP协议 1,TCP 简介 TCP(Transmission Control Protocol)是…...
Disruptor并发编程框架
Disruptor是一款高性能的并发编程框架,主要具有以下特点和功能: 1. RingBuffer环形数据结构 Disruptor的核心数据结构是RingBuffer环形队列,用于存储客户端的并发数据并在生产者和消费者之间传递。队列以批量方式的顺序存储,可以高效地进行并发读写操作。 2. 无锁设计 Disrup…...

matlab 点云精配准(1)——point to point ICP(点到点的ICP)
目录 一、算法原理参考文献二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 参考文献 [1] BESL P J,MCKAY N D.A method for registration of 3-Dshapes[J].IEEE Tran…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...