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引用,可使函数能够正确的生成并使用临时变量(如果实参与引用参数不匹配,就会生成临时变量)


 

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

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

相关文章

Pandas基础知识

文章目录 Pandas的数据结构Series --- 由数据和索引组成&#xff08;索引&#xff08;index&#xff09;在左&#xff0c;数据&#xff08;values&#xff09;在右&#xff09;DataFrame --- 索引包括行索引和列索引&#xff0c;每列数据可以是不同的类型 Pandas的索引操作 ---…

SpringMVC拦截器学习笔记

SpringMVC拦截器 拦截器知识 拦截器(Interceptor)用于对URL请求进行前置/后置过滤 Interceptor与Filter用途相似但实现方式不同 Interceptor底层就是基于Spring AOP面向切面编程实现 拦截器开发流程 Maven添加依赖包servlet-api <dependency><groupId>javax.se…

C++学习之九

1)普通类的成员函数模板 class A { public:template<typename T> //类的成员函数模板,//成员函数模板和函数模板长得样子一样&#xff01;void func(T tmp); };template<typename T> void A::func(T tmp) {cout << tmp << endl; }int main() {A a;a.…

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…

2023年国赛数学建模思路 - 案例:随机森林

文章目录 1 什么是随机森林&#xff1f;2 随机深林构造流程3 随机森林的优缺点3.1 优点3.2 缺点 4 随机深林算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff…

leetcode做题笔记95. 不同的二叉搜索树 II

给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 思路一&#xff1a;递归 struct TreeNode ** partition(int start, int end, int* returnSize){*returnSize 0;int size 32;stru…

从2023年世界机器人大会发现机器人新趋势

机器人零部件为何成2023年世界机器人大会关注热门&#xff1f; 在原先&#xff0c;机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今&#xff0c;机器人的主体框架结构已经落实&#xff0c;更多机器人已经开始深入到各类场景中…

c++ std::sort的简单用法

直接看代码即可&#xff0c;对于lambda部分的解释&#xff1a;a,b基本算作两个抽象的比较对象&#xff0c;每次会比较这两个&#xff0c;返回true:表示a应该排在b前面(a<b)&#xff0c;返回false:表示b应该排在a前面(a>b)&#xff0c;具体可查看cpprefernece #include &…

Prompt本质解密及Evaluation实战(一)

一、基于evaluation的prompt使用解析 基于大模型的应用评估与传统应用程序的评估不太一样&#xff0c;特别是基于GPT系列或者生成式语言模型&#xff0c;因为模型生成的内容与传统意义上所说的内容或者标签不太一样。 以下是借用了ChatGPT官方的evaluation指南提出的对结果的具…

kali的一些使用和ms08-067、ms17-010漏洞

VM虚拟机-三种网络连接方式&#xff08;桥接、NAT、仅主机模式&#xff09; 虚拟机网络连接 一、Bridged&#xff08;桥接&#xff09; 二、NAT&#xff08;网络地址转换&#xff09; 三、Host-Only&#xff08;仅主机&#xff09; 在vmware软件中&#xff0c;选项栏的“编…

[计算机入门] 窗口操作

3.3 窗口操作 之前介绍过如何调整窗口大小。接下来介绍如何对窗口进行排布等操作。 当我们想要将某个窗口调整到整个屏幕的左边或者右边(占整个屏幕的一半)&#xff0c;可以在选中并激活窗口后&#xff0c;按Win ←/→ 进行调整。 此时&#xff0c;还可以通过Win↑/↓调整该…

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

微信小程序教学系列 第三章&#xff1a;小程序高级开发技巧 1. 小程序API的使用 小程序API简介 小程序API是小程序提供的一系列接口&#xff0c;用于实现各种功能和操作。通过调用小程序API&#xff0c;可以实现页面跳转、数据存储、网络请求等功能。 使用小程序API的步骤…

ATFX汇市:杰克逊霍尔年会降至,鲍威尔或再发鹰派言论

环球汇市行情摘要—— 昨日&#xff0c;美元指数下跌0.11%&#xff0c;收盘在103.33点&#xff0c; 欧元升值0.22%&#xff0c;收盘价1.0898点&#xff1b; 日元贬值0.58%&#xff0c;收盘价146.23点&#xff1b; 英镑升值0.18%&#xff0c;收盘价1.2757点&#xff1b; 瑞…

Flutter GetXController 动态Tabbar 报错问题

场景&#xff1a; 1.Tabbar的内容是接口获取的 2. TabController? tabController;&#xff1b; 在onInit 方法中初始化tabbarController tabController TabController(initialIndex: 0, length: titleDataList.length, vsync: this); 这时候会报一个错误 Controllers l…

docker版jxTMS使用指南:使用jxTMS提供数据

本文讲解了如何jxTMS的数据访问框架&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内容 4…

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

微信小程序教学系列 第八章&#xff1a;小程序国际化开发 欢迎来到第八章&#xff01;这一次我们要谈论的是小程序国际化开发。你可能会问&#xff0c;什么是国际化&#xff1f;简单来说&#xff0c;国际化就是让小程序能够适应不同的语言和地区&#xff0c;让用户们感受到更…

Python 合并多个 PDF 文件并建立书签目录

今天在用 WPS 的 PDF 工具合并多个文件的时候&#xff0c;非常不给力&#xff0c;居然卡死了好几次&#xff0c;什么毛病&#xff1f;&#xff01; 心里想&#xff0c;就这么点儿功能&#xff0c;居然收了我会员费都实现不了&#xff1f;不是吧…… 只能自己来了&#xff0c;…

导出pdf

该方法导出的pdf大小是A4纸的尺寸&#xff0c;如果大于1页需要根据元素高度进行截断的话&#xff0c;页面元素需要加 class ergodic-dom&#xff0c;方法里面会获取ergodic-dom元素&#xff0c;对元素高度和A4高度做比较&#xff0c;如果大于A4高度&#xff0c;会塞一个空白元素…

Android6:片段和导航

创建项目Secret Message strings.xml <resources><string name"app_name">Secret Message</string><string name"welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Star…

maven 从官网下载指定版本

1. 进入官网下载页面 Maven – Download Apache Maven 点击下图所示链接 2. 进入文件页&#xff0c;选择需要的版本 3. 选binaries 4. 选文件&#xff0c;下载即可