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++中,有三种使用命名空间的方法:
- 加命名空间名称及作用域限定符,例如
N::a
- 使用
using
将命名空间中某个成员引入,也称部分展开,例如using N::a
- 使用
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++中,可以使用cout
和cin
配合流插入运算符<<
和流提取运算符>>
使用,例如:
💡
使用cout
和cin
时需要包含头文件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
会自动忽略空白字符
- 也可以使用指定的方式使用
cout
和cin
//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,称x
和y
为缺省参数,两个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++中,缺省参数分为
- 全缺省参数
- 半缺省参数
全缺省参数
全缺省参数是指在函数声明或定义时,所有变量都是缺省参数,例如
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中,有63个关键字,而C语言只有32个关键字 asm do i…...

GEE遥感云大数据林业应用典型案例及GPT模型应用
近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇…...

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

数据结构面试常见问题之Insert or Merge
😀前言 本文将讨论如何区分插入排序和归并排序两种排序算法。我们将通过判断序列的有序性来确定使用哪种算法进行排序。具体而言,我们将介绍判断插入排序和归并排序的方法,并讨论最小和最大的能区分两种算法的序列长度。 🏠个人主…...
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,装完后有520MB,建议安装在D:盘 在云计算…...

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)
雪崩效应 我们把基础服务故障,导致上层服务故障,并且这个故障不断放大的过程,成为雪崩效应。 雪崩效应,往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池,线程池满…...
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,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原…...

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

C++的vector类(一):vector类的常见操作
目录 前言 Vector类 遍历与初始化vector vector的扩容机制 vector的对象操作 find与insert 对象数组 前言 string类中还有一些内容需要注意: STL 的string类怎么啦? C面试中string类的一种正确写法 C STL string的Copy-On-Write技术 C的st…...
SpringBoot注解
Spring Boot 中常用的一些注解及其作用如下所示: SpringBootApplication:标注一个主程序类,用于启动 Spring Boot 应用,通常放在包的最顶层。 RestController:结合 Controller 和 ResponseBody,用于定义 R…...
每日三个JAVA经典面试题(十九)
1.Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?Java并发API中的Lock接口提供了一种比传统synchronized块或方法更灵活、更强大的线程同步机制。Lock接口允许更细粒度的锁控制,通过它可以实现更复杂的线…...

springboot企业级抽奖项目业务一(登录模块)
开发流程 该业务基于rouyi生成好了mapper和service的代码,现在需要在controller层写接口 实际操作流程: 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在登录模块有登录和登出方…...

【Python + Django】启动简单的文本页面
前言: 为了应付(bushi)毕业论文,总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识,这也算是为自己的测试经历增添光彩吧!!! 希望、希望大家…...
Docker——问题解决:服务器端和Windows端IP互通
踩了大坑,特此记录!!!!! 我在服务器端部署了服务,但是在本地端Windows机器上无法访问,因此卡了一天。 1. 双向Ping通 防火墙导致只能单向Ping通 首先需要解决双向ping通的问题&…...
HTTP跨域
1. 简介 HTTP跨域是指不同域名下的网页请求资源时,由于浏览器同源策略限制,导致请求被阻止。为解决这一问题,开发者常采用跨域资源共享(CORS)等技术来允许合法跨域请求,确保网站功能正常运行。 同源 协议…...

用Python的turtle库绘制皮卡丘
turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现,turtle库是一种标准库,是python自带的。 turtle(海龟)是一种真实的存在,有一个海龟在窗口的正中心,在画布上游走,走过的轨迹形成了绘制的图形࿰…...
C语言打印当前时间
#include <time.h> void print_current_time(char* func_name) { // 获取当前的时间 time_t current_time; time(¤t_time); // 将时间转换为本地时间格式 struct tm *local_time localtime(¤t_time); // 打印当前的时间 …...

(一)基于IDEA的JAVA基础4
注释文本,注释模版 单行注释://开头放在代码前面,对少部分。 多行注释:快捷方式ctrlshift/,对段落代码注 释。 文档注释:/**……**/,用于声明作者或创作时 间。 文档注释如何设置,首先找到File中…...
【Python】复习12:标准库与第三方库
目录 概念标准库第三方库总结Python 标准库`os` 模块`sys` 模块`json` 模块`re` 模块`datetime` 模块代码示例`os` 模块例子`sys` 模块例子`json` 模块例子`re` 模块例子`datetime` 模块例子第三方库`numpy``pandas``requests`安装第三方库使用第三方库其他一些流行的Python库数…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: 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)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

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