C++特性——命名空间、I/O流以及缺省参数

news2024/11/24 9:09:56

C++特性

文章目录

1. 写在前面

可以认为,C++的语法和语义基本上包含了C语言的所有内容。二者之间的关系大致可以用下图表示:

在这里插入图片描述

同时,C++在C语言的基础上引入了许多额外的特性和概念,下面,我们就来学习C++有而C语言没有的特性。


2. 命名空间

我们都知道,C语言有一大不足之处,那就是命名冲突,这可能是和库里面函数的名字发生冲突,也可能是与自己定义的变量冲突,例如:

#include <stdio.h>
#include <stdlib.h>

int rand = 1;

int main()
{
	printf("%d\n", rand);
	return 0;
}

会有如下报错信息:
注:对于为什么会发生命名冲突以及其他情况可以看看👉变量名和函数名的冲突问题

在这里插入图片描述

这里就可以看见,全局变量rand和库函数rand的名字之间发生了冲突。而为了解决这种类似的命名冲突,C++就有了命名空间这一概念和用法:

C++中的命名空间是一种用于组织和管理代码的机制,允许将全局作用域内的标识符(例如变量、函数、类)分组为命名空间。这有助于避免命名冲突,并提供更好的代码结构和可维护性。

具体用法:

namespace space_name
{
    //变量
    //函数
    //结构
    //…………
}

例如,对于上面的全局变量rand,我们可以这样写从而避免错误:

#include <stdio.h>
#include <stdlib.h>

//定义了一个名为test的命名空间
namespace test
{
	int rand = 1;
}

int main()
{

	printf("%d\n", test :: rand);

	return 0;
}

注:符号::为域作用限定符,用于引用指定命名空间的成员。

2.1 命名空间的嵌套

命名空间可以嵌套定义,例如:

#include <stdio.h>
#include <stdlib.h>

namespace test_1
{
	int num_1 = 1;

	namespace test_2
	{
		int num_2 = 2;
	}
}

int main()
{
	printf("%d\n", test_1 :: test_2 :: num_2);

	return 0;
}

小细节:不同级别的命名空间的名字可以相同,例如,上面的test_2就可以改为test_1,程序同样可以正常运行。但是,对于同一级别的命名空间的名字,如果两个空间内没有同名变量,那这两个命名空间就可以同名,否则就不能同名,例如:

这种写法是正确的:

namespace test_1
{
	int num = 1;

}

namespace test_1
{
	int num_1 = 2;
}

而这种写法是错误的:

namespace test_1
{
	int num = 1;

}

namespace test_1
{
	int num = 2;
}

2.2 命名空间的完全展开

我们可以用using namespace space_name;,来将一个命名空间完全展开,这样,再使用命名空间内的成员时,就可以不用使用域作用限定符::,例如:

#include <stdio.h>
#include <stdlib.h>

namespace test
{
	int num = 1;
}

using namespace test;

int main()
{
	printf("%d\n", num);

	return 0;
}

注意:将命名空间完全展开这一做法具有一定的危险性,如果我们将命名空间比作是一道城墙,那么将命名空间展开就可以看作是将这道城墙推到,让城墙内的东西完全暴露。因此,只有确保命名空间的内容不会和库中内容发生冲突时,才可以将命名空间展开

错误示例:

#include <stdio.h>
#include <stdlib.h>

namespace test
{
	int rand = 1;
}

using namespace test;

int main()
{
	printf("%d\n", rand);

	return 0;
}

报错信息:

在这里插入图片描述

2.3 命名空间的指定展开

每次指定命名空间很不方便,但是直接将命名空间展开又会有冲突风险,那么我们就可以采取一个折中的办法——命名空间的指定展开

我们可以用using space_name :: number;来实现,例如:

#include <stdio.h>
#include <stdlib.h>

namespace test
{
	int num1 = 1;
	int num2 = 2;
	int rand = 3;
}

//对num1, num2指定展开
using test::num1;
using test::num2;

int main()
{
	printf("%d\n", num1);

	return 0;
}

3. C++的I/O流

一般来说,我们学习一门语言的第一串代码就是打印字符串Hello World,现在就让我们来看看C++版的Hello World

#include <iostream>

//有关输入输出流的关键字通常都在 std 命名空间中
using namespace std;

int main()
{
	cout << "Hello World" << endl;

	return 0;
}

要理解这段代码,我们就需要了解C++的I/O流

C++ 中的输入输出流(I/O streams)是用于处理输入和输出的重要概念。它们是 C++ 标准库中的一部分,用于读取和写入数据到不同的设备,例如键盘、屏幕、文件、网络等。C++ 中主要的 I/O 流类是基于两个主要类模板构建的:istreamostream。这两个类分别用于输入和输出。

以下是常用的类和基本操作:

  • 上面所包含的头文件iostream就是istreamostream的派生类,它提供了输入和输出的功能

  • coutconsole out,称为流插入,将类容输出到控制台,相当于C语言的printf。需要注意,cout可以自动识别变量类型,因此可以多组不同类型的数据同时输出,例如:

    int num1 = 10;
    double num2 = 3.14;
    cout << "Hello World" << endl << num1 << endl << num2 << endl;
    
  • <<:用于将数据写入流

  • endl:C++的换行符,例如

    cout << "Hello World" << endl << num1 << endl << num2 << endl;
    //等价于
    cout << "Hello World" << '\n' << num1 << '\n' << num2 << '\n';
    
  • cinconsole in,称为流提取,用于从流中读取数据,相当于C语言中的scanf。和cout一样,cin也可以自动识别变量类型

  • >>:用于从流中读取数据,例如:

    int num1 = 0;
    double num2 = 0.0;
    
    cin >> num1 >> num2;
    

4. 缺省参数

缺省参数就是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参

缺省参数分为以下两类:

  • 全缺省参数:函数的所有参数都为缺省参数,例如:

    void Func(int a = 10, int b = 20);
    
  • 半缺省参数:部分参数为缺省参数,例如:

    void Func(int a, int b = 10);
    

缺省参数的使用实例:

#include <iostream>

using namespace std;

void Func(int a, int b = 10)
{
	cout << "a = " << a << endl << "b = " << b << endl;
}

int main()
{
	Func(100);
	Func(100, 0);

	return 0;
}

output:

a = 100
b = 10
a = 100
b = 0

4.1 使用缺省参数的注意事项

  1. 当一个函数的参数为部分缺省时缺省值只能从右往左给,且必须连续,否则编译器无法判断传入的实参代表着哪个形参。例如:

    void Func(int a, int b = 10, int c)
    {
    	cout << b << endl;
    }
    

    会有如下报错信息:

    在这里插入图片描述

  2. 如果一个函数的参数都是缺省参数,那么传入的实参必须是连续的。例如下面的函数调用就是错误的:

    #include <iostream>
    
    using namespace std;
    
    void Func(int a = 1, int b = 10, int c = 100)
    {
    	cout << a << endl << b << endl << c << endl;
    }
    
    int main()
    {
    	Func( , 1, );
    
    	return 0;
    }
    
  3. 缺省参数不能在函数的声明和定义中同时出现,且只能在函数声明的时候给(如果同时,那么编译器不知道用哪一个,如果只在定义中给,那么当其他文件引用时,就不知道这个值)

  4. 缺省参数必须是常量或者是全局变量


本篇完。

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

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

相关文章

十六、代码校验(4)

本章概要 调试 使用 JDB 调试图形化调试器 调试 尽管聪明地使用 System.out 或日志信息能给我们带来对程序行为的有效见解&#xff0c;但对于困难问题来说&#xff0c;这种方式就显得笨拙且耗时了。 你也可能需要更加深入地理解程序&#xff0c;仅依靠打印日志做不到。此时…

【牛客面试必刷TOP101】Day8.BM33 二叉树的镜像和BM36 判断是不是平衡二叉树

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

2015架构案例(五十一)

第5题 【说明】某信息技术公司计划开发一套在线投票系统&#xff0c;用于为市场调研、信息调查和销售反馈等业务提供服务。该系统计划通过大量宣传和奖品鼓励的方式快速积累用户&#xff0c;当用户规模扩大到一定程度时&#xff0c;开始联系相关企业提供信息服务&#xff0c;并…

关于RNNoise、webrtc_ns、三角带通滤波器、对数能量

语音特征参数MFCC提取过程详解 其中讲解了&#xff1a;三角带通滤波器 、计算每个滤波器组输出的对数能量、对数能量、经离散余弦变换&#xff08;DCT&#xff09;得到MFCC系数 推荐阅读某乎这位大佬的全部文章&#xff1a; 下面是几篇出自这位大佬的很好的文章&#xff1a; …

MySQL进阶(回望MySQL)——从数据资产谈起 MySQL的DOS命令、常用数据类型、SQL语句的分类 SQL函数

前言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言&#xff0c;它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言&#xff0c;可以用于多种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;如MySQ…

小程序需带参数跳转

1、需要生成二维码的数据 直接在浏览器中替换成自己的appid&#xff0c;secret及可生成一个access_token https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appidwxxxxx&secretxxxxx用access_token https://api.weixin.qq.com/wxa/getwxacode…

【LeetCode热题100】--215.数组中的第K个最大元素

215.数组中的第K个最大元素 本题主要是返回数组排序之后的倒数第k个位置 方法一&#xff1a;基于快速排序 思路和算法 我们可以用快速排序来解决这个问题&#xff0c;先对原数组排序&#xff0c;再返回倒数第 k 个位置&#xff0c;这样平均时间复杂度是 O(nlog⁡n)&#xff0…

管程的介绍

一、概述 1.引入原因 信号量机制实现同步存在编写程序困难&#xff0c;易出错问题 2.概念 是一种实现进程互斥与同步的机制&#xff0c; 3.组成 共享数据结构说明、对数据结构操作的过程/函数、初始化共享数据、管程名&#xff1b; 4.特点 类似类的结构(数据对象相关操…

IDEA通过Docker插件部署SpringBoot项目

1、配置Docker远程连接端口 找到并编辑服务器上的docker.service文件。 vim /usr/lib/systemd/system/docker.service在下面ExecStart替换成下面的 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock2.重启docker systemctl daemon-reload s…

强化学习(Reinforcement Learning)与策略梯度(Policy Gradient)

写在前面&#xff1a;本篇博文的内容来自李宏毅机器学习课程与自己的理解&#xff0c;同时还参考了一些其他博客(懒得放链接)。博文的内容主要用于自己学习与记录。 1 强化学习的基本框架 强化学习(Reinforcement Learning, RL)主要由智能体(Agent/Actor)、环境(Environment)、…

CSS padding(填充)

CSS padding&#xff08;填充&#xff09;是一个简写属性&#xff0c;定义元素边框与元素内容之间的空间&#xff0c;即上下左右的内边距。 padding&#xff08;填充&#xff09; 当元素的 padding&#xff08;填充&#xff09;内边距被清除时&#xff0c;所释放的区域将会受到…

最新Base64注入攻击和代码分析技术

点击星标&#xff0c;即时接收最新推文 本文选自《web安全攻防渗透测试实战指南&#xff08;第2版&#xff09;》 点击图片五折购书 Base64注入攻击 Base64注入攻击的测试地址在本书第2章。 从URL中可以看出&#xff0c;参数ID经过Base64编码&#xff08;“%3d”是“”的URL编码…

Vulnhub系列靶机-Raven2

文章目录 Raven2 渗透测试1. 信息收集1.1 主机探测1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用3.1 msfconsole3.2 交互式shell 4. 权限提升 Raven2 渗透测试 1. 信息收集 1.1 主机探测 arp-scan -l1.2 端口扫描 nmap -p- -A 192.168.188.213通过nmap工具进行端口扫描…

LeetCode【54】螺旋矩阵

题目&#xff1a; 思路&#xff1a; 参考&#xff1a;https://blog.csdn.net/ShiXiAoLaNga/article/details/124975293 上下左右&#xff0c;四个游标&#xff0c;代表边界&#xff0c;每次遍历完一行或一列都移动游标&#xff1b;直到 down > up、right < left&#xf…

使用hugging face开源库accelerate进行多GPU(单机多卡)训练卡死问题

目录 问题描述及配置网上资料查找1.tqdm问题2.dataloader问题3.model(input)写法问题4.环境变量问题 我的卡死问题解决方法 问题描述及配置 在使用hugging face开源库accelerate进行多GPU训练&#xff08;单机多卡&#xff09;的时候&#xff0c;经常出现如下报错 [E Process…

key value存储到底有什么优势?

昨天被问到Key value存储到底有什么优势&#xff0c;当然脑子也没太转过来。正好昨天学习了B树和LSM树的差别&#xff0c;并了解到LSM树底层是可以用sstable来实现的。sstable包含一个数据块列表和一个索引块&#xff0c;数据块存储有序键镇对&#xff0c;索引块存储所有数据块…

navicate安装教程

Navicat是一款数据库管理工具&#xff0c;它支持多种数据库类型&#xff0c;包括MySQL、MariaDB、Oracle、SQL Server等。Navicat具有直观的图形用户界面和易于使用的功能&#xff0c;可以让用户轻松地管理和操作数据库。 首先&#xff0c;Navicat提供了一种简单的方法来连接到…

Linux gcc和make学习

文章目录 GCCgcc的安装gcc的工作流程 makefilemakefile的规则工作原理自动生成makefile的变量自定义变量预定义变量自动变量 模式匹配函数wildcard函数patsubst函数 伪声明 GCC gcc全程是&#xff08;GNU compiler collection CNU编译器套件&#xff09;&#xff0c;是由GNU开发…

【汇编语言学习笔记】一、基础知识

引言 汇编语言是直接在硬件之上工作的编程语言&#xff0c;首先要了解硬件系统的结构&#xff0c;才能有效的应用汇编语言对其编程。 1.1机器语言 机器语言是机器指令的集合。 机器指令展开来讲就是一台机器可以正确执行的命令。 1.2汇编语言 汇编语言的主体是汇编指令。 …

2023年中国特高压绝缘子市场规模及特高压投资完成额统计[图]

绝缘子指一般由固体绝缘材料制成&#xff0c;安装在不同点位的导体之间或导体与接地构件之间&#xff0c;是同时起到电气绝缘和机械支撑作用的器件&#xff0c;绝缘子可分为瓷绝缘子、玻璃绝缘子与复合绝缘子。特高压绝缘子指用于交流1,000kV、直流800kV及以上电压等级的绝缘子…