【C++初阶】C++入门(一):命名空间C++的输入输出缺省参数函数重载

news2024/11/14 14:54:19

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:数据结构
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 1.什么是C++
    • 1.1 C++的发展史
    • 1.2 C++关键字(C++98)
  • 2.命名空间
    • 2.1命名空间的定义
      • 2.1.1命名空间的普通定义
      • 2.1.2命名空间可以嵌套定义
      • 2.1.3同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其成员合成在同一个命名空间中
    • 2.2命名空间的使用
      • 2.2.1加命名空间名称及作用域限定符
      • 2.2.2使用using将命名空间中的成员引入
      • 2.2.3使用using namespace 命名空间名称引入
  • 3.C++中的输入和输出
  • 4.缺省参数
    • 4.1缺省参数的概念
    • 4.2缺省参数分类
      • 4.2.1全缺省参数
      • 4.2.2半缺省参数
  • 5.函数重载
    • 5.1函数重载的概念
    • 5.2函数重载的原理:名字修饰
    • 5.3 extern “C”
  • 6.总结:

1.什么是C++

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象) 思想,支持面向对象的程序设计语言应运而生。
 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此,C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

1.1 C++的发展史

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。

语言的发展也是随着时代的进步,在逐步递进的,C++的历史版本:
在这里插入图片描述

C++还在不断地向后发展

1.2 C++关键字(C++98)

C++中总计有63个关键字,这其中有32个是C语言中的关键字:
在这里插入图片描述

2.命名空间

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

2.1命名空间的定义

定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对{}中即为命名空间的成员。

2.1.1命名空间的普通定义

//命名空间的普通定义
namespace N1 //N1为命名空间的名称
{
	//在命名空间中,既可以定义变量,也可以定义函数
	int a;
	int Add(int x, int y)
	{
		return x + y;
	}
}

2.1.2命名空间可以嵌套定义

//命名空间的嵌套定义
namespace N1 //定义一个名为N1的命名空间
{
	int a;
	int b;
	namespace N2 //嵌套定义另一个名为N2的命名空间
	{
		int c;
		int d;
	}
}

2.1.3同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其成员合成在同一个命名空间中

在这里插入图片描述
在这里插入图片描述

因此我们不能在相同名称的命名空间中定义两个相同名称的成员。
注意:一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。

2.2命名空间的使用

一般变量的搜索情况:局部域->全局域->展开了的命名空间域 or 指定访问命名空间域
现在我们已经知道了如何定义命名空间,那么我们应该如何使用命名空间中的成员呢?

命名空间的使用有以下三种方式:

2.2.1加命名空间名称及作用域限定符

符号“::”在C++中叫做域作用限定符,我们通过“命名空间名称::命名空间成员”便可以访问到命名空间中相应的成员。

:: 的左边为,如果有命名空间域,则限定访问命名空间域中的内容,如果域左边为空,访问的就是全局域,会直接到全局范围内找 :: 右边的变量或其他。

//加命名空间名称及作用域限定符
#include <stdio.h>
namespace N
{
	int a;
	double b;
}
int main()
{
	N::a = 10;//将命名空间中的成员a赋值为10
	printf("%d\n", N::a);//打印命名空间中的成员a
	return 0;
}

2.2.2使用using将命名空间中的成员引入

我们还可以通过“using 命名空间名称::命名空间成员”的方式将命名空间中指定的成员引入。这样一来,在该语句之后的代码中就可以直接使用引入的成员变量了。

//使用using将命名空间中的成员引入
#include <stdio.h>
namespace N
{
	int a;
	double b;
}
using N::a;//将命名空间中的成员a引入
int main()
{
	a = 10;//将命名空间中的成员a赋值为10
	printf("%d\n", a);//打印命名空间中的成员a
	return 0;
}

2.2.3使用using namespace 命名空间名称引入

最后一种方式就是通过”using namespace 命名空间名称“将命名空间中的全部成员引入。这样一来,在该语句之后的代码中就可以直接使用该命名空间内的全部成员了。

//使用using namespace 命名空间名称引入
#include <stdio.h>
namespace N
{
	int a;
	double b;
}
using namespace N;//将命名空间N的所有成员引入
int main()
{
	a = 10;//将命名空间中的成员a赋值为10
	printf("%d\n", a);//打印命名空间中的成员a
	return 0;
}

3.C++中的输入和输出

我们在学C语言的时候,第一个写的代码就是在屏幕上输出一个"hello world",现在我们也应该使用C++来输出:

#include <iostream>
using namespace std;
int main()
{
	cout << "hello world!" << endl;
	return 0;
}

在C语言中有标准输入输出函数scanf和printf,而在C++中有cin标准输入cout标准输出。在C语言中使用scanf和printf函数,需要包含头文件stdio.h。在C++中使用cin和cout,需要包含头文件iostream以及std标准命名空间。

C++的输入输出方式与C语言相比是更加方便的,因为C++的输入输出不需要增加数据格式控制,例如:整型为%d,字符型为%c。

#include <iostream>
using namespace std;
int main()
{
	int i;
	double d;
	char arr[20];
	cin >> i;//读取一个整型
	cin >> d;//读取一个浮点型
	cin >> arr;//读取一个字符串
	cout << i << endl;//打印整型i
	cout << d << endl;//打印浮点型d
	cout << arr << endl;//打印字符串arr
	return 0;
}

:代码中的endl的意思是输出一个换行符。

4.缺省参数

4.1缺省参数的概念

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

#include <iostream>
using namespace std;
void Print(int a = 0)
{
	cout << a << endl;
}
int main()
{
	Print();//没有指定实参,使用参数的默认值(打印0)
	Print(10);//指定了实参,使用指定的实参(打印10)
	return 0;
}

4.2缺省参数分类

4.2.1全缺省参数

全缺省参数,即函数的全部形参都设置为缺省参数。

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

4.2.2半缺省参数

半缺省参数,即函数的参数不全为缺省参数。

void Print(int a, int b, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

注意
 1、半缺省参数必须从右往左依次给出,不能间隔着给。

//错误示例
void Print(int a, int b = 20, int c)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

同时,使用缺省值,必须从右往左连续使用:
eg.全缺省参数这样传参:Func(, 2, ) 就是错误的,传参必须连续,缺省值使用必须从右往左连续使用 !

2、缺省参数不能在函数声明和定义中同时出现

//错误示例
//test.h
void Print(int a, int b, int c = 30);
//test.c
void Print(int a, int b, int c = 30)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

注意:我们平时使用缺省参数,是在声明时给缺省值,定义不能给。

3、缺省值必须是常量或者全局变量。

//正确示例
int x = 30;//全局变量
void Print(int a, int b = 20, int c = x)
{
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
}

5.函数重载

5.1函数重载的概念

函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表必须不同。函数重载常用来处理实现功能类似,而数据类型不同的问题。

#include <iostream>
using namespace std;
int Add(int x, int y)
{
	return x + y;
}

double Add(double x, double y)
{
	return x + y;
}
int main()
{
	cout << Add(1, 2) << endl;//打印1+2的结果
	cout << Add(1.1, 2.2) << endl;//打印1.1+2.2的结果
	return 0;
}

注意:形参列表不同是指参数个数参数类型或者参数顺序不同,若仅仅是返回类型不同,则不能构成重载。

5.2函数重载的原理:名字修饰

为什么C++支持函数重载,而C语言不支持函数重载呢?

一个C/C++程序要运行起来都需要经历以下几个阶段:预处理编译汇编链接

预处理阶段头文件.h的展开、#define 宏的替换、注释的删除,条件编译。->文件名.i
编译阶段将每个源文件的全局范围的变量符号分别进行汇总,生成汇编代码->文件名.s
汇编阶段会给每个源文件汇总出来的符号分配一个地址(若符号只是一个声明,则给其分配一个无意义的地址),然后分别生成一个符号表,汇编代码转换为二进制机器码->文件名.o
最后链接阶段会将每个源文件的符号表进行合并,若不同源文件的符号表中出现了相同的符号,则取合法的地址为合并后的地址(重定位)->文件名.exe/a.out
在这里插入图片描述

C语言中,汇编阶段进行符号汇总时,一个函数汇总后的符号就是其函数名,所以当汇总时发现多个相同的函数符号时,编译器便会报错。

C++ 在进行符号汇总时,对函数的名字修饰做了改动,函数汇总出的符号不只是函数的函数名,而是通过其参数的类型和个数以及顺序等信息汇总出 一个符号,这样一来,就算是函数名相同的函数,只要其参数的类型或参数的个数或参数的顺序不同,那么汇总出来的符号也就不同了。
在这里插入图片描述
Windows下函数名修饰规则:
在这里插入图片描述

:不同编译器下,对函数名的修饰不同。

Linux 下函数名修饰规则:
通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数名称长度+函数名+类型首字母】

在这里插入图片描述

总结
 1、C语言不能支持重载,是因为同名函数没办法区分。而C++是通过函数修饰规则来区分的,只要函数的形参列表不同,修饰出来的名字就不一样,也就支持了重载。
 2、也理解了,为什么函数重载要求参数不同,与返回值没关系,因为返回值在调用的时候不会体现,在编译的时候就会报错了->调用歧义。

//错误
int Func();
double Func();
int main()
{
	Func();//调用歧义
	return 0;
}

5.3 extern “C”

有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加“extern C”,意思是告诉编译器,将该函数按照C语言规则来编译。

注意:在函数前加“extern C”后,该函数便不能支持重载了。

6.总结:

今天我们了解了什么是C++,认识并具体学习了有关命名空间、C++的输入输出、缺省函数、函数重载的知识,开始了C++入门之旅。接下来,我们将继续学习C++的相关知识。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

最新Tuxera NTFS2023最新版Mac读写NTFS磁盘工具 更新详情介绍

Tuxera NTFS for Mac是一款Mac系统NTFS磁盘读写软件。在系统默认状态下&#xff0c;MacOSX只能实现对NTFS的读取功能&#xff0c;Tuxera NTFS可以帮助MacOS 系统的电脑顺利实现对NTFS分区的读/写功能。Tuxera NTFS 2023完美兼容最新版本的MacOS 11 Big Sur&#xff0c;在M1芯片…

Python统计学:如何理解样本统计量?

本期介绍样本统计量是怎么算的&#xff0c;并用Python来模拟随机抽样。用一个在鱼塘捞鱼的简单例子来理解样本均值的概念。 如何理解重复试验&#xff1f; 指能够在完全相同条件下进行多次的试验&#xff1b; 比如我们抛10枚硬币&#xff0c;用来计算正面出现的概率&#xff…

4.7 贝塞尔曲线

学习目标&#xff1a; 学习贝塞尔曲线可以遵循以下步骤&#xff1a; 1.了解基本概念和定义&#xff1a;学习贝塞尔曲线前需要了解贝塞尔曲线的基本概念和定义&#xff0c;如何定义一条贝塞尔曲线、控制点的概念以及贝塞尔曲线的几何性质等。 2.学习贝塞尔曲线的构造方法&…

Django搭建一个简易GPT网站

文章目录 环境安装创建主项目和应用程序在 settings.py 文件中注册应用程序在 views.py 文件中为应用程序创建视图配置应用程序的 URL创建和渲染模板KEY实现发送提示功能注意事项完整源码 环境安装 pip install django openai创建主项目和应用程序 处理完项目的环境后&#x…

第二个机器学习应用:乳腺癌数据集在决策树模型上的挖掘

目录 决策树优化与可视化 1 决策树分类 2 决策树可视化 3 显示树的特征重要性 特征重要性可视化 决策树回归 1 决策树回归 决策树优化与可视化 1 决策树分类 from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier from sk…

基于C++开发的医院医学影像PACS 可二次开发,三维重建

医学影像PACS系统源码&#xff0c;集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大&#xff0c;代码完整。有演示。 本套PACS系统专门针对医院工作流程设计的&am…

分布式ID生成策略总结

1、UUID 2、数据库自增ID 2.1、主键表 2.2、ID自增步长设置 3、号段模式 4、Redis INCR 5、雪花算法 6、美团(Leaf) 7、百度(Uidgenerator) 8、滴滴(TinyID) 总结比较 背景 在复杂的分布式系统中&#xff0c;往往需要对大量的数据进行唯一标识&#xff0c;比如在对…

springboot中的日志

作者&#xff1a;~小明学编程 文章专栏&#xff1a;spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 为什么需要日志 如何使用日志功能 日志的打印 获取日志对象 使用日志对象打印日志 日志级别 为什么我们需要把日志分为如此多的种类呢&am…

今天面试招了个25K的测试员,从腾讯出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-25k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

《系统架构设计》-07-面向领域的技术设计

文章目录 1 实体与值对象1.1 实体对象1.1.1 唯一标识&#xff08;Identity&#xff09;1.1.2 可变性贫血模型充血模型 1.2 值对象1.3 示例&#xff08;识别实体和值对象&#xff09;1&#xff09;识别实体对象2&#xff09;提取值对象3&#xff09;挖掘实体的关键行为4&#xf…

solidworks2022 - feature works 变灰的解决方法

文章目录 solidworks2022 - feature works 变灰的解决方法概述实验feature works 变灰问题的重现备注END solidworks2022 - feature works 变灰的解决方法 概述 feature works 用于step文件转零件. 一般是不同版本的solidworks交换文件的方法. 今天突然发现, 我自己转出的ste…

Spring框架使用总结

Spring框架使用 前言处理事务管理声明式事务&#xff1a;编程式事务&#xff1a; 框架核心常见注解 AOP&#xff08; 面向切面编程&#xff09;切面和通知有哪些类型&#xff1f;切面的类型通知类型AOP实现使用场景 IOC(管理所有的JavaBean)依赖注入&#xff08;DI&#xff09;…

像素比特行列置乱加密算法安全性分析

比特行列置乱加密 将MN大小的灰度图像每个像素值转换为8bit二进制&#xff0c;得到M8N大小的二值图像。 基于加密秘钥&#xff0c;生成随机序列TM和TN分别对二进制图像的行列进行置乱&#xff0c;生成置乱加密后的图像。 Logistic混沌序列加密&#xff1a; 选择明文攻击过程 …

Node内置模块 【path模块】

文章目录 &#x1f31f;前言&#x1f31f;path模块&#x1f31f;引用模块&#x1f31f;常用属性&#x1f31f;path.sep&#x1f31f;在MacOSX、 Unix、Linux操作系统上&#xff1a;&#x1f31f;在 Windows 上&#xff1a; &#x1f31f;常用方法&#x1f31f;将路径转换为对象…

【python视图1】networkx操作Graph图

一、说明 数据可视化需要显示种种数据&#xff0c;matplotlib负责曲线类画图&#xff0c;然而类似于图论的操作用什么方法。这里用networkx程序包完成。本文专门介绍这种程序包的用法。 二、生成图&#xff08;Creating a graph&#xff09; 2.1 创建一个没有节点和边的空图。…

Linux:centos 7:查看运行级别 控制init运行级别 已安装图形化以后设置开机进入图形化或命令行

0 target 关机状态&#xff0c;使用该级别时将关闭主机 1 rescue.target 单用户模式&#xff0c;不需要密码验证即可登录系统&#xff0c;多用于系统维护 …

HTTP 的工作原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、简单 HTTP二、HTTP 连接请求 I请求Ⅱ 持久 HTTP并执行 HTTP默认浏览器连接设置总结 前言 在处理 Web 性能监控或优化时&#xff0c;了解 HTTP 协议的基础知…

leetcode每日一题——美团笔试题【3】

第一题&#xff1a; 股票的最大利润 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f;示例 1:输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在…

UWB隧道人员定位技术应用,施工作业安全精准保障

隧道施工的安全不仅关系到工程项目的质量和施工效率&#xff0c;也关系到我国的资金安全、施工人员和人民的生命财产安全。如何有效加强隧道施工的安全管理能力&#xff0c;成为隧道施工企业管理者最关心的问题。国家铁道局在《关于加强铁路隧道工程安全工作的若干意见》中指出…

人力资源软件的六个功能,你知道吗?

企业组织越来越多地转向通过人力资源软件来简化他们的人力资源运作。在疫情开始后&#xff0c;人力资源软件的采用尤其迅猛&#xff0c;因为组织希望无缝地管理他们的远程和混合员工。根据SkyQuest的调查人力资源技术市场预计到2028年将达到356.8亿美元。 如果您正在考虑采用人…