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

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、类型更加严格 不初始化&#xff0c;无法通过编译&#xff1b;C不初始化&#xff0c;则随机赋值 #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登录&#xff0c;或者降级副驾驶 经过研究&#x…...

新的后端渲染:服务器驱动UI

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

Postman如何做接口自动化测试?

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

excel文本函数篇2

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

【MyBatis】动态SQL > 重点:${...}和#{...}与resultMap和resultType的区别

目录 一、MyBatis动态sql 1.1 动态sql的作用 1.2 动态sql作用论证 1.2.1 条件判断&#xff1a;<if> 1.2.2 循环迭代&#xff1a;<foreach> 1.2.3 SQL片段重用 1.2.4 动态条件组合&#xff1a;<choose><when><otherwise> 1.2.5 <where…...

什么是BEM命名规范?为什么要使用BEM命名规范?

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

JavaScript:交集和差集的应用场景

在集合A和集合B中&#xff0c;属于集合A&#xff0c;同时也属于集合B的元素组成的集合&#xff0c;就是交集。 在A中所有不属于集合B元素&#xff0c;组合成集合&#xff0c;就是差集。 那么在平时的开发中&#xff0c;如何使用差集和交集来解决问题呢&#xff1f; 现在有这…...

达梦数据库表空间创建和管理

概述 本文将介绍在达梦数据库如何创建和管理表空间。 1.创建表空间 1.1表空间个数限制 理论上最多允许有65535个表空间&#xff0c;但用户允许创建的表空间 ID 取值范围为0~32767&#xff0c; 超过 32767 的只允许系统使用&#xff0c;ID 由系统自动分配&#xff0c;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年&#xff0c;为加拿大庞巴迪(Bombardier)设计列车监控系统界面设计。 2015-至今&#xff0c;为中车集团旗下若干公司提供HMI列车监控系统界面设计,综合考虑中车特点、城轨车、动车组的不同需求以及HMI硬键屏和触摸 屏的不同操作方式&#xff0c;重构框架设计、交互设计、…...

Blazor前后端框架Known-V1.2.13

V1.2.13 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…...

vue 复制文本

一个常用的库就是 clipboard.js&#xff0c;它可以帮助您实现跨浏览器的复制到剪贴板功能 首先&#xff0c;安装 clipboard.js&#xff1a; cnpm install clipboard 创建一个 Vue 组件并使用 clipboard.js&#xff1a; <template><div><input v-model"…...

西瓜书第三章

广义线性模型 考虑单点可微函数 g ( ⋅ ) g(\cdot) g(⋅)&#xff0c;令 y g − 1 ( ω T x b ) yg^{-1}(\omega^{T}xb) yg−1(ωTxb)&#xff0c;这样得到的模型称为“广义线性模型”&#xff0c;其中函数 g ( ⋅ ) g(\cdot) g(⋅)称为“联系函数”。显然&#xff0c;对数线…...

关于python如何使用sqlalchemy连接sap_hana数据库

1.先安装sqlalchemy pip install sqlalchemy 2.from sqlalchemy import create_engine 3.创建数据库连接方式&#xff1a; 假设数据连接方式如下&#xff1a; usernameH_TEOPT passwordww122222 jdbcUrljdbc:sap://192.163.1.161:21681/?currentschema 那么使用sqlalchemy 的…...

微信小程序教学系列(5)

微信小程序教学系列 第五章&#xff1a;小程序发布与推广 第一节&#xff1a;小程序发布流程介绍 小伙伴们&#xff0c;欢迎来到第五章的教学啦&#xff01;在这一章中&#xff0c;我们将一起来探索小程序的发布与推广流程。你准备好了吗&#xff1f;让我们开始吧&#xff0…...

【计算机网络篇】TCP协议

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; TCP协议 1&#xff0c;TCP 简介 TCP&#xff08;Transmission Control Protocol&#xff09;是…...

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…...

【JVM】运行时数据区域

文章目录 说明程序计数器虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 说明 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直…...

uniapp踩坑合集

1、onPullDownRefresh下拉刷新不生效 pages.json对应的style中enablePullDownRefresh设置为true&#xff0c;开启下拉刷新 {"path" : "pages/list/list","style" :{"navigationBarTitleText": "页面标题名称","enable…...

再JAVA中如何使用qsort对类进行排序?

目录 结论&#xff1a; 解析&#xff1a; 结论&#xff1a; import java.util.Arrays;class Person implements Comparable<Person>{public String name;public int age;public Person(String name, int age) {this.name name;this.age age;}Overridepublic Stri…...

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…...

解决`idea`中`database`工具查询起别名乱码问题

文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二&#xff1a;修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…...

UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3

目录 之前的文章&#xff1a; 1.5 Blend Attributes by Value 发射器更新 粒子生成 粒子更新 2.1 Static Beams ​编辑 发射器更新&#xff1a; 粒子生成 粒子更新 2.2 Dynamic Beams 没有开始模拟前的效果是&#xff1a; 开始模拟后的效果是&#xff1a; 发射器更新 …...

Docker 容器数据卷

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法&#xff1a;在挂载目录后多加一个--privilegedtrue参数即可 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行…...

STM32--MPU6050与I2C外设

文章目录 前言MPU6050参数电路MPU6050框图 IIC外设框图 IIC的基本结构软件IIC实现MPU6050硬件IIC实现MPU6050 前言 在51单片机专栏中&#xff0c;用过I2C通信来进行实现AT24C02的数据存储&#xff1b; 里面介绍的是利用程序的编程来实现I2C的时序&#xff0c;进而实现AT24C02与…...

项目管理实战笔记1:项目管理常识

序 看了下极客时间的《项目管理实战》&#xff0c;觉得跟之前学习PMP的标准资料还是有所侧重。重新整理下&#xff0c;相比书上繁杂的知识&#xff0c;这个更通俗易懂。 1 角色转换&#xff1a;三大误区 误区1&#xff1a;事必躬亲 自己做事情是可控的&#xff0c;做项目依赖…...

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化

时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SVMD逐次变分模态分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SVMD分解算法&#xff0c;分解结果可视化&#xff0c;MATLAB程序&#xff…...

乐都企业网站建设哪家好/百度账户托管公司

1.了解单点登录 需要源码 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) &#xff0c;并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个) 2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进…...

11网拍推广平台/seo诊断站长

2019独角兽企业重金招聘Python工程师标准>>> 1、firewalld的基本使用 启动&#xff1a; systemctl start firewalld 关闭&#xff1a; systemctl stop firewalld 查看状态&#xff1a; systemctl status firewalld 开机禁用 &#xff1a; systemctl disable firew…...

常宁网站建设/百度热门排行榜

–ACC建模大数据用于精简用例的实践 作者&#xff1a;emilyxlchen生活的智慧&#xff0c;有时不在于多&#xff0c;而在于少。同理适用于测试用例的管理中。 一&#xff0e;热身活动&#xff1a;数一数你的产品总用例 随着互联网时代节奏的日益加快&#xff0c;许多产品都会…...

洛阳网站在哪备案/seo搜索引擎优化工资多少钱

1、过拟合曲线 逻辑回归过拟合 决策树的过拟合曲线 2、停止训练的条件 &#xff08;1&#xff09;节点的所有数据的输出y一致 &#xff08;2&#xff09;没有特征继续用来分割了 3、选择更简单的树 “Among competing hypotheses, the one with fewest assumptions should b…...

南京公司网站建设/全网推广外包公司

此文转载自&#xff1a;https://blog.csdn.net/weixin_50998641/article/details/110247848#commentBox第一题view_source鼠标无法查看网页源代码&#xff0c;可以利用F12来查看&#xff0c;flag就在网页源码中。第二题robots根据题目提示robots&#xff0c;此题考查robots协议…...

怎么在网站上做404页面/外链工厂

扩展教程 网站备案流程 转载于:https://www.cnblogs.com/Frank99/p/11028060.html...