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

C语言向C++过渡的基础知识(一)

目录

C++关键字

C++命名空间

命名空间的介绍

域作用限定符

命名空间的使用

C++的输入以及输出

C++中的缺省参数

缺省参数的介绍

缺省参数的使用

缺省参数的分类

全缺省参数

半缺省参数


C++关键字

在C++中,有63个关键字,而C语言只有32个关键字

asm do if return try continue auto double inline short typedef for
bool dynamic_cast int signed typeid public break else long sizeof typename    
throw case enum mutable static union wchar_t catch explicit namespace         
static_cast unsigned default char export new struct using friend class extern operator switch virtual register const false private template void true
const_cast float protected this volatile while delete goto reinterpret_cast

📌

这些关键字不需要死记硬背

C++命名空间

命名空间的介绍

在C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。而使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的,而定义一个命名空间就相当于定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

例如,在C语言中,对于下面的程序

#include <stdio.h>
#include <stdlib.h>int rand = 10;int main()
{printf("%d\n", rand);return 0;
}
报错内容:
“rand”: 重定义;以前的定义是“函数”

因为在C语言中,存在一个名为rand()的函数,此时若将变量名定义为rand会与标准库中rand()函数名产生冲突,而C语言能解决这个问题方法只有更改变量名,否则没有其他办法

但是在C++中,可以使用命名空间解决这个问题

所谓命名空间指当前命名的变量所处的空间,在命名空间中,可以声明变量/类型/函数,例如

//命名空间1
namespace test1
{//变量int i = 0;//类型struct Student{int age;char name[20];};//函数int add(int x, int y){return x + y;}
}

在C++中,使用namespace关键字创建命名空间,语法如下:

namespace 命名空间名
{//变量/函数/类型
}//注意最后一行不需要分号,不同于结构体

在C++中,命名空间可以嵌套定义,例如:

//命名空间2
namespace test2
{int num = 0;//命名空间3namespace test3{int num = 0;}
}

对于上面的代码,在命名空间test2中嵌套定义了一个命名空间test3

有了命名空间,就可以解决上面C语言出现的问题,解决方法如下:

//头文件NameSpace.h中的命名空间4
//将rand变量放入命名空间test4中
namespace test4
{int rand = 10;
}//测试文件
//C++主函数
#include <iostream>
#include <stdlib.h>
#include "NameSpace.h"int main()
{//调用命名空间4中的rand变量,而不是标准库中的rand()函数printf("%d\n", test4::rand);return 0;
}
输出结果:
10

域作用限定符

在C++中,::表示域作用限定符,使用方法如下:

空间 :: 变量/类型/对象名

::左侧空间为空时,默认在全局中寻找::右侧的内容,例如:

//NameSpace.h文件中的命名空间2与嵌套的命名空间3
//命名空间2
namespace test2
{int num = 20;//命名空间3namespace test3{int num = 30;}
}//C++主函数
#include <iostream>
#include <stdlib.h>
#include "NameSpace.h"//全局变量
int num = 10;int main()
{//域作用限定符//局部变量int num = 0;printf("%d\n", num);//全局变量printf("%d\n", ::num);//指定命名空间的变量printf("%d\n", test2::num);//嵌套的命名空间的变量printf("%d\n", test2::test3::num);return 0;
}
输出结果:
0
10
20
30

命名空间的使用

在C++中,有三种使用命名空间的方法:

  1. 加命名空间名称及作用域限定符,例如N::a
  2. 使用using将命名空间中某个成员引入,也称部分展开,例如using N::a
  3. 使用using将命名空间整体引入,也称全局展开,例如using namespace N

测试实例:

//NameSpace.h中的命名空间1
namespace test1
{//变量int i = 10;//类型struct Student{int age;char name[20];};//函数int add(int x, int y){return x + y;}
}//加命名空间名称及作用域限定符
#include <iostream>
#include "NameSpace.h"int main()
{printf("%d", test1::i);return 0;
}
输出结果:
10//部分展开
#include <iostream>
#include "NameSpace.h"
using test1::i;int main()
{printf("%d", i);return 0;
}
输出结果:
10//全局展开
#include <iostream>
#include "NameSpace.h"
using namespace test1;int main()
{printf("%d\n", i);return 0;
}
输出结果:
10

💡

在实际使用过程中,更推荐指定以及部分展开,如果只是自己练习时,更推荐使用全局展开

注意,使用 using namespace N并不代表在函数中不可以指定,部分展开和全局展开都只是改变寻找方式,并不是使用了其中一种方式其他方式不可以再使用,只是大范围会包括小范围,而如果已经全局展开,那么再指定将直接去指定的命名空间找,而不是在全局展开的命名空间中找

当存在两个相同的命名空间时,会被合并成一个命名空间,而不是直接覆盖,例如

//NameSpace.h中的两个重名的命名空间
//两个同名的命名空间
namespace test5
{int num1 = 10;
}namespace test5
{int num2 = 20;
}//测试文件
//同名命名空间合并
#include <iostream>
#include "NameSpace.h"
using namespace std;
using namespace test5;int main()
{cout << test5::num1 << endl;cout << test5::num2 << endl;return 0;
}
输出结果:
10
20

C++的输入以及输出

在C++中,可以使用coutcin配合流插入运算符<<和流提取运算符>>使用,例如:

💡

使用coutcin时需要包含头文件iostream,注意C++的标准库头文件不包含不带有.h,并且需要引入命名空间std(C++中的标准命名空间)或者直接指定。因此推荐使用<iostream>+std的方式

//C++的输入和输出
#include <iostream>
using namespace std;int main()
{int num = 0;cout << "请输入数值:";cin >> num;cout << num << endl;return 0;
}
输入:
10
输出结果:
请输入数值:10
10

在上面的代码中,定义了一个num变量,通过标准输入对象cin和流提取运算符>>控制变量num的输入,不同于C语言,此处输入可以不需要取地址运算符&,对变量内容的输出使用标准输出对象cout和流插入运算符<<控制内容的输出,而endl表示换行符,作用效果类似'\n'

在C++中,输入和输出可以自动识别变量类型,故输出和输入不需要占位符

#include <iostream>
using namespace std;int main()
{//int num = 0;//cout << "请输入数值:";//cin >> num;//cout << num << endl;int num = 0;double num1 = 0;char c = 0;cin >> num >> num1 >> c;//多组内容的输入,相当于scanf("%d%lf%c", &num, &num1, &c);cout << num << ' ' << num1 << ' ' << c;//多组内容输出,相当于printf("%d %f %c", num, num1, c);return 0;
}
输入:
1 2.5 c
输出结果:
1 2.5 c

📌

scanf一样,cin会自动忽略空白字符

  • 也可以使用指定的方式使用coutcin
//C++的输入和输出
#include <iostream>int main()
{int num = 0;std::cin >> num;std::cout << num << std::endl;return 0;
}
输入:
10
输出:
10

C++中的缺省参数

缺省参数的介绍

在C++中,缺省参数是指在函数的定义以及声明中可以为形式参数赋值,例如

int add(int x = 0, int y = 0)
{return (x + y);
}

在上面的代码中,变量x和变量y赋值为0,称xy为缺省参数,两个0为两个缺省参数的缺省值,缺省值必须是常量或者全局变量

如果调用add函数时不传入实际参数或者同类型数值时,则add函数直接使用缺省参数的数值进行计算,例如

#include <iostream>
using namespace std;int add(int x = 0, int y = 0)
{return (x + y);
}int main()
{//调用add函数不传参数cout << add() << endl;//调用add函数传一个参数cout << add(1) << endl;//调用addd函数传两个参数cout << add(1, 2) << endl;return 0;
}
输出结果:
0
1
3

缺省参数的使用

在C++中,缺省参数有两种,第一种是全缺省参数,第二种是半缺省参数

在使用缺省参数时,必须遵循从右往左连续使用,不可以跳跃式使用,例如对于下面的函数:

int add(int x = 0, int y = 0, int z = 0)
{return (x + y);
}

使用时满足从右往左使用

//缺省参数
#include <iostream>
using namespace std;int add1(int x = 0, int y = 0, int z = 0)
{return (x + y);
}int main()
{//使用缺省参数时必须从右往左连续使用//正确使用方法add1(1, 2);//使用第三个缺省参数add1(1);//使用第二个和第三个缺省参数add1();//使用全部缺省参数add1(1, 2, 3);//不使用缺省参数//错误使用方法add1(1, , 2);//不可以直接使用第二个缺省参数add1(, 1, 2);//不可以直接使用第一个缺省参数add1(, , 1);//不可以直接使用第一个和第二个缺省参数add1(, 1, );//不可以直接使用第一个和第三个缺省参数return 0;
}

📌

“从右往左使用”意思是,当调用函数给函数传递实际参数时,第一个实参对应着第一个第一个形参,第二个实参对应着第二个形参,第三个实参对应着第三个形参,使用缺省参数时,当只传递一个实际参数时,该实际参数对应着第一个形参,此时使用第二个和第三个缺省参数,同理,当传递两个实际参数时,两个实际参数对应的前两个形参,使用第三个缺省参数,即总是满足最右边的缺省参数是第一个使用的

“连续使用”意思是,给函数传递实际参数到形参时,不能出现类似于第一个实际参数传给第一个形参,第二个实际参数不传内容,第三个实际参数传递给形参等间隔性的传递

缺省参数的分类

在C++中,缺省参数分为

  1. 全缺省参数
  2. 半缺省参数

全缺省参数

全缺省参数是指在函数声明或定义时,所有变量都是缺省参数,例如

int add1(int x = 0, int y = 0, int z = 0)
{return (x + y);
}

半缺省参数

半缺省参数是指在函数声明或定义中,部分变量是缺省参数,例如

int add1(int x, int y = 0, int z = 0)//只有y和z是缺省变量
{return (x + y);
}

半缺省参数中,必须满足从右往左依次连续给出,不可以跳跃式给缺省参数(由于从右往左使用的原则),不是缺省变量的需要在调用时传递实际参数,例如

//半缺省参数
int add2(int x, int y = 0, int z = 0)
{return (x + y);
}int add3(int x, int y, int z = 0)
{return (x + y);
}//不可以跳跃式给缺省值
int add4(int x = 0, int y, int z)
{return (x + y);
}int add5(int x, int y = 0, int z)
{return (x + y);
}int main()
{add2(1);//只有一个不是缺省参数时,必须为该形参传递实参add3(1, 2);//有两个不是缺省参数时,必须为两个形参传递实参add4(, 2, 3);//不可以使用,需要满足从右往左使用缺省参数的原则add5(1, , 3);//不可以使用,需要满足从右往左使用缺省参数的原则return 0;
}

声明和定义函数缺省参数时,一般建议声明时给缺省参数和缺省值,而定义时不给缺省值,例如

//NameSpace.h中的函数声明
int add6(int a = 20);//测试文件
//定义不给缺省值
int add6(int a)
{return a;
}#include <iostream>
#include "NameSpace.h"
using namespace std;int main()
{cout<<add6(2)<<' ';cout<<add6()<<'\n';return 0;
}
输出结果:
2 20

相关文章:

C语言向C++过渡的基础知识(一)

目录 C关键字 C命名空间 命名空间的介绍 域作用限定符 命名空间的使用 C的输入以及输出 C中的缺省参数 缺省参数的介绍 缺省参数的使用 缺省参数的分类 全缺省参数 半缺省参数 C关键字 在C中&#xff0c;有63个关键字&#xff0c;而C语言只有32个关键字 asm do i…...

GEE遥感云大数据林业应用典型案例及GPT模型应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…...

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载 3 月 8 日凌晨&#xff0c;macOS Sonoma 14.4 发布&#xff0c;同时带来了 macOS Ventru 13.6.5 和 macOS Monterey 12.7.4 安全更新。 macOS Ventura 13.6 及更新版本&#xff0c;如无特殊说明皆为安全更新&…...

数据结构面试常见问题之Insert or Merge

&#x1f600;前言 本文将讨论如何区分插入排序和归并排序两种排序算法。我们将通过判断序列的有序性来确定使用哪种算法进行排序。具体而言&#xff0c;我们将介绍判断插入排序和归并排序的方法&#xff0c;并讨论最小和最大的能区分两种算法的序列长度。 &#x1f3e0;个人主…...

perl 用 XML::LibXML 解析 Freeplane.mm文件,XML文件

Perl 官网 www.cpan.org 从 https://strawberryperl.com/ 下载网速太慢了 建议从 https://download.csdn.net/download/qq_36286161/87892419 下载 strawberry-perl-5.32.1.1-64bit.zip 约105MB 解压后安装.msi&#xff0c;装完后有520MB&#xff0c;建议安装在D:盘 在云计算…...

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障&#xff0c;导致上层服务故障&#xff0c;并且这个故障不断放大的过程&#xff0c;成为雪崩效应。 雪崩效应&#xff0c;往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池&#xff0c;线程池满…...

Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示

Arduino RP2040 + SSD1306 I2C OLED +LittleFS存储GBK字库实现中文显示 📌LittleFS插件安装,可以参考《Arduino RP2040 LittleFS的使用介绍》🎈相关内容《Arduino esp8266 软件I2C SSD1306 +LittleFS存储GBK字库实现中文显示》🔖基于Earle F. Philhower, III的核心固件开…...

代码随想录算法训练营第day53|1143.最长公共子序列 、 1035.不相交的线、 53. 最大子序和 动态规划

目录 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 1143.最长公共子序列 力扣题目链接(opens new window) 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原…...

【Flutter学习笔记】10.2 组合现有组件

参考资料&#xff1a; 《Flutter实战第二版》 10.2 组合现有组件 在Flutter中页面UI通常都是由一些低级别组件组合而成&#xff0c;当我们需要封装一些通用组件时&#xff0c;应该首先考虑是否可以通过组合其他组件来实现&#xff0c;如果可以&#xff0c;则应优先使用组合&…...

C++的vector类(一):vector类的常见操作

目录 前言 Vector类 遍历与初始化vector ​vector的扩容机制 vector的对象操作 find与insert 对象数组 前言 string类中还有一些内容需要注意&#xff1a; STL 的string类怎么啦&#xff1f; C面试中string类的一种正确写法 C STL string的Copy-On-Write技术 C的st…...

SpringBoot注解

Spring Boot 中常用的一些注解及其作用如下所示&#xff1a; SpringBootApplication&#xff1a;标注一个主程序类&#xff0c;用于启动 Spring Boot 应用&#xff0c;通常放在包的最顶层。 RestController&#xff1a;结合 Controller 和 ResponseBody&#xff0c;用于定义 R…...

每日三个JAVA经典面试题(十九)

1.Java Concurrency API 中的 Lock 接口(Lock interface)是什么&#xff1f;对比同步它有什么优势&#xff1f;Java并发API中的Lock接口提供了一种比传统synchronized块或方法更灵活、更强大的线程同步机制。Lock接口允许更细粒度的锁控制&#xff0c;通过它可以实现更复杂的线…...

springboot企业级抽奖项目业务一(登录模块)

开发流程 该业务基于rouyi生成好了mapper和service的代码&#xff0c;现在需要在controller层写接口 实际操作流程&#xff1a; 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…...

【Python + Django】启动简单的文本页面

前言&#xff1a; 为了应付&#xff08;bushi&#xff09;毕业论文&#xff0c;总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识&#xff0c;这也算是为自己的测试经历增添光彩吧&#xff01;&#xff01;&#xff01; 希望、希望大家…...

Docker——问题解决:服务器端和Windows端IP互通

踩了大坑&#xff0c;特此记录&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我在服务器端部署了服务&#xff0c;但是在本地端Windows机器上无法访问&#xff0c;因此卡了一天。 1. 双向Ping通 防火墙导致只能单向Ping通 首先需要解决双向ping通的问题&…...

HTTP跨域

1. 简介 HTTP跨域是指不同域名下的网页请求资源时&#xff0c;由于浏览器同源策略限制&#xff0c;导致请求被阻止。为解决这一问题&#xff0c;开发者常采用跨域资源共享&#xff08;CORS&#xff09;等技术来允许合法跨域请求&#xff0c;确保网站功能正常运行。 同源 协议…...

用Python的turtle库绘制皮卡丘

turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现&#xff0c;turtle库是一种标准库&#xff0c;是python自带的。 turtle(海龟)是一种真实的存在&#xff0c;有一个海龟在窗口的正中心&#xff0c;在画布上游走&#xff0c;走过的轨迹形成了绘制的图形&#xff0…...

C语言打印当前时间

#include <time.h> void print_current_time(char* func_name) { // 获取当前的时间 time_t current_time; time(&current_time); // 将时间转换为本地时间格式 struct tm *local_time localtime(&current_time); // 打印当前的时间 …...

(一)基于IDEA的JAVA基础4

注释文本&#xff0c;注释模版 单行注释://开头放在代码前面&#xff0c;对少部分。 多行注释:快捷方式ctrlshift/,对段落代码注 释。 文档注释:/**……**/&#xff0c;用于声明作者或创作时 间。 文档注释如何设置&#xff0c;首先找到File中…...

【Python】复习12:标准库与第三方库

目录 概念标准库第三方库总结Python 标准库`os` 模块`sys` 模块`json` 模块`re` 模块`datetime` 模块代码示例`os` 模块例子`sys` 模块例子`json` 模块例子`re` 模块例子`datetime` 模块例子第三方库`numpy``pandas``requests`安装第三方库使用第三方库其他一些流行的Python库数…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...