初识C++(上) -- C++的关键字、命名空间、缺省参数以及函数的重载

news2024/11/24 2:09:11

目录

一、C++的关键字(C++98)

二、命名空间

1、命名冲突

2、命名空间

 2.1 命名空间的定义

(1). 命名空间定义的例子以及命名空间的嵌套:

(2). 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中:

2.2 命名空间的使用

2.2.1 双冒号:: 在C++中的作用

2.2.2 使用命名空间的三种方式

(1).  加命名空间名称及作用域限定符

(2).  使用using将命名空间中某个成员引入

(3). 使用using namespace 命名空间名称 引入

(4) .  补充知识

 三、C++输入&&输出

四、缺省参数

1、概念

2、缺省参数的分类

五、函数重载

1、引入

2、概念

3、C++支持函数重载的原理--名字修饰(name Mangling)

3.1. Linux下函数名修饰的规则:

3.2.  在 Windows下名字修饰规则


一、C++的关键字(C++98)

C++总计63个关键字,C语言32个关键字

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_cast

ps:我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。
 

二、命名空间

1、命名冲突

在C语言中,如果在项目中定义一个变量,但这个变量的名字正好与C标准库中的某个函数的名字相同。这时编译器在编译时就会报错,那就是定义的变量和库函数发生了命名冲突

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
    printf("%d\n", rand);
    return 0;
}

 

从上图中我们可以看出,rand函数会生成一个随机数,随后我们又在全局中定义一个变量rand。如果我们想打印rand,编译器编译时就会发生错误。

C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决。

2、命名空间

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

 2.1 命名空间的定义

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

(1). 命名空间定义的例子以及命名空间的嵌套:
// Test.cpp
namespace test
{
	//命名空间中可以定义变量/函数/类型
	namespace test1
	{
		int rand = 6;
	}

	namespace test2
	{
		int rand = 7;
	}

	int Add(int left, int right)
	{
		return left + right;
	}
	
	struct Node
	{
		struct Node* next;
		int val;
	};
}
(2). 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中:

ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个

// test.h
namespace N1
{
int Mul(int left, int right)
{
return left * right;
}
}

// test.cpp
namespace N1
{
int a;
int b;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int c;
int d;
int Sub(int left, int right)
{
return left - right;
}
}
}

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
 

2.2 命名空间的使用

2.2.1 双冒号:: 在C++中的作用

(1).  命名空间作用域分辨符号。当需要使用命名空间中的某个成员时,可以使用双冒号来表示该成员所在的命名空间

printf("%p\n", rand);

// :: 域作用限定符	
printf("%d\n", test::rand);
printf("%d",test::Add(1, 2));
struct test::Node node;

(2).  表示作用域限定符。当需要在类的定义中使用外部的全局变量或函数时,可以使用双冒号来表示该变量或函数的作用域。

2.2.2 使用命名空间的三种方式
(1).  加命名空间名称及作用域限定符
int main()
{
    printf("%d\n", N::a);
    return 0;
}
(2).  使用using将命名空间中某个成员引入
using N::b;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    return 0;
}
(3). 使用using namespace 命名空间名称 引入
using namespce N;
int main()
{
    printf("%d\n", N::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;
}

(4) .  补充知识

什么是 using namespace std?

using namespace 空间名 就相当于展开指定空间,使得封装在指定空间内的所有数据不使用作用域限定符的情况下就能被空间外部直接访问。

std就相当于是C++官方库定义的命名空间,C++的库函数都是放在std这个命名空间内的。

两个不同的命名空间中创建相同名字的变量 ,如果在main函数中想打印这个变量会发生什么情况?

 三、C++输入&&输出

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;
int main()
{
    cout<<"Hello world!!!"<<endl;
    return 0;    
}

1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std

2. cout和cin是全局的流对象endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。

3. <<是流插入运算符,>>是流提取运算符。

4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。                                                                                  

5. 实际上cout和cin分别是ostreamistream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。

cin和cout中的'c' :  是控制台(console)的意思,在Linux下叫终端.

四、缺省参数

1、概念

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

void Func(int a = 0)
{
    cout<<a<<endl;
}
int main()
{
    Func(); // 没有传参时,使用参数的默认值
    Func(10); // 传参时,使用指定的实参
    return 0;
}

2、缺省参数的分类

  • 全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

  • 半缺省参数
void Func(int a, int b = 10, int c = 20)
{
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
}

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现
  3. 缺省值必须是常量或者全局变量 (大多数都是常量)
  4. C语言不支持(编译器不支持)

五、函数重载

1、引入

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

2、概念

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

1. 函数参数类型不同 

// 1、参数类型不同
int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}
double Add(double left, double right)
{
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}

int main()
{
    Add(10, 20);
    Add(10.1, 20.2);

    return 0;
}

2. 参数个数不同

// 2、参数个数不同
void f()
{
    cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}

int main()
{
    f();
    f(10);
    return 0;
}

warnning:

3. 参数类型顺序不同

// 3、参数类型顺序不同
void f(int a, char b)
{
    cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
    cout << "f(char b, int a)" << endl;
}
int main()
{
    f(10, 'a');
    f('a', 10);
    return 0;
}

3、C++支持函数重载的原理--名字修饰(name Mangling)

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

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

在C语言中,当程序运行到链接这个步骤时,编译器需要通过函数名来找到这个函数的地址. 所以C语言不存在同名函数,如果存在同名函数,那编译器将无法识别哪个函数要被链接.

而C++在链接这个阶段就不是通过函数名来寻找函数的地址. 在C++中, 经历了汇编后,函数名会根据编译器指定的规则被修饰成对应的名字.

演示: 

由于在VS编译器下修饰的规则过于繁琐,我们就用Linux下的g++编译器来看.

3.1. Linux下函数名修饰的规则:

_Z + 函数名字个数 + 函数名 + 参数类型的首字母

例:  void func(int i, double b)   -->   _Z4funcid

采用C++编译器编译后结果

 

结论在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
 

采用C语言编译器编译后结果

结论:在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。
 

3.2.  在 Windows下名字修饰规则

对比Linux会发现,windows下vs编译器对函数名字修饰规则相对复杂难懂,但道理都是类似的,我们就不做细致的研究了.

  • 通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
  • 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
     

这篇文章就到这吧,下篇文章在继续讲解!!!

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

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

相关文章

计算机网络socket编程(1)_UDP网络编程实现echo server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(1)_UDP网络编程实现echo server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交…

[安洵杯 2019]easy_web 详细题解

知识点: 编码转换 命令执行 linux空格_关键字绕过 打开页面 发现url 是 /index.php?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 有img参数和cmd参数 cmd参数是没赋值的,随便赋值为123456 页面没有反应 鼠标移动到图片下面时发现有东西,当然直接查看页面源代码也可以发现 尝…

免费,基于React + ECharts 国产开源 IoT 物联网 Web 可视化数据大屏

文末查看开源项目地址 Light Chaser 是一款国产开源免费的基于 React18、Vite5、TypeScript5 技术栈实现的 Web 可视化大屏设计工具&#xff0c;支持Docker方式部署&#xff0c;支持MySQL、PostgreSQL、SQL Server、Oracle 数据源。 你可以简单快速地搭建数据可视化展示、数据报…

Linux服务管理-DHCP

DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一个局域网的网络协议&#xff0c;它允许服务器自动地将IP地址和其他网络配置参数分配给网络中的计算机。DHCP极大地简化了网络管理&#xff0c;尤其是当大量设备需要接入…

如何使用Netdata部署高性能的服务器监控平台

简介 Netdata 是一个开源的、实时的性能和健康监控工具&#xff0c;专为系统、应用程序、SNMP 设备等而设计。它以其高度交互的 Web 仪表板和极低的资源开销而闻名。 主要特点&#xff1a;实时监控、全面监控、零配置、轻量级、交互式仪表板、可扩展性、警报和通知、分布式监…

【MySQL】深度学习与解析 : 库的操作知识整合

前言&#xff1a;本节内容是MySQL库的操作&#xff0c; 内容较少&#xff0c; 大体内容为创建库、删除库、修改库、库备份操作。 ps:本节内容适合安装了MySQL的友友们进行观看&#xff0c; 实操更有利于记住哦。 目录 创建数据库 查看数据库列表 创建数据库 删除数据库 …

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01目录1. A Perspective for Adapting Generalist AI to Specialized Medical AI Applications and Their Challenges2. Synergi…

白杨SEO:百度在降低个人备案类网站搜索关键词排名和流量?怎样应对?【参考】

很久没有写百度或者网站这块内容了&#xff0c;一是因为做百度网站朋友越来越少&#xff0c;不管是个人还是企业&#xff1b;二是百度上用户搜索与百度给到网站的流量都越来越少。 为什么想到今天又来写这个呢&#xff1f;因为上个月有个朋友来咨询我说网站百度排名全没了&…

5分钟科普:AI网关是什么?应用场景是什么?有没有开源的选择?

AI网关的功能及其定义 AI网关位于企业应用与内外部大模型调用的交汇点&#xff0c;能够灵活地将请求转发给内部自建模型或外部大模型服务提供商&#xff0c;甚至海外的服务商。它管理着企业所有的AI出口流量&#xff0c;为企业内的不同团队提供了多方面的优势。 对于开发团队…

Java学习Day60:微服务总结!(有经处无火,无火处无经)

1、技术版本 jdk&#xff1a;17及以上 -如果JDK8 springboot&#xff1a;3.1及其以上 -版本2.x springFramWork&#xff1a;6.0及其以上 -版本5.x springCloud&#xff1a;2022.0.5 -版本格林威治或者休斯顿 2、模拟springcloud 父模块指定父pom <parent><…

登录功能设计(php+mysql)

一 登录功能 1. 创建一个登录页面&#xff08;login.php&#xff09;&#xff0c;包含一个表单&#xff0c;用户输入用户名和密码。 2. 在表单的提交事件中&#xff0c;使用PHP代码处理用户输入的用户名和密码。 3. 首先&#xff0c;连接MySQL数据库。然后&a…

【物联网技术】ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式介绍与AT指令介绍

前言:本文对ESP8266 WIFI模块STA、AP、STA+AP、TCP/UDP透传工作模式进行介绍;以及AT指令介绍,包括基础AT指令,WIFI功能AT指令、TCP/IP相关AT指令、常用AT指令实例进行介绍。 ESP8266 WIFI模块的接线及固件烧写可参考我的这篇博客:正点原子ATK-ESP8266 WIFI模块接线及固件…

【前端】JavaScript 方法速查大全-函数、正则、格式化、转换、进制、 XSS 转义(四)

&#x1f525; 前言 在现代前端开发中&#xff0c;JavaScript 是不可或缺的语言。无论是处理数据、操作 DOM&#xff0c;还是进行复杂的逻辑运算&#xff0c;掌握 JavaScript 的各种方法都是每位开发者的必修课。本文将为您提供一个全面、系统的 JavaScript 方法参考&#xff…

关于路由笔记

路由 定义&#xff1a; 在计算机网络中&#xff0c;路由是将数据包从源节点传输到目标节点的过程。这个过程涉及到网络中的多个设备&#xff0c;如路由器、交换机等&#xff0c;其中路由器起着关键的决策作用。 工作原理示例&#xff1a; 假设你在一个公司的局域网内&#…

25.停车场管理系统(基于web的Java项目)

目录 1.系统的受众说明 2.相关技术与方法 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 需求分析 3.2.1 系统功能描述 3.2.2 用例图分析 4. 系统设计 4.1 系统类分析 5. 系统详细设计与实现 5.1 用户登录 5.2 系统信…

【含开题报告+文档+源码】基于SpringBoot+Vue智能居民健康检测系统设计与实现

开题报告 随着社会发展和人民生活水平的提高&#xff0c;人们对健康生活的要求越来越高。而广大居民由于条件限制&#xff0c;存在着健康管理服务不足的问题。本文基于JavaWeb技术&#xff0c;设计并实现了一种居民健康检测系统。首先&#xff0c;本文对该平台的需求进行了分析…

SCNU习题 总结与复习

1. P1:构建最大二叉树 【分治】 重点 构树函数需要注意的点&#xff1b; 前序遍历需要注意&#xff0c;本题的输出有点特点。若一个结点无左子&#xff0c;无右子就不再下去遍历&#xff1b; 其他情况都要下去遍历&#xff1b; 2. P2 寻找多数【分治】 没啥&#xff0c;注意…

ssm060基于SSM的高校共享单车管理系统的设计与实现+vue(论文+源码)_kaic

设计题目&#xff1a;高校共享单车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0…

【算法】(Python)贪心算法

贪心算法&#xff1a; 又称贪婪算法&#xff0c;greedy algorithm。贪心地追求局部最优解&#xff0c;即每一步当前状态下最优选择。试图通过各局部最优解达到最终全局最优解。但不从整体最优上考虑&#xff0c;不一定全局最优解。步骤&#xff1a;从初始状态拆分成一步一步的…

记一次微信云托管搭建Redis服务

背景 最近在做一个微信小程序&#xff0c;规划服务全部部署在云托管上面&#xff0c;本次使用了对象存储、mysql、java服务、Redis服务&#xff08;pc端用的&#xff09;。 由于对部署Redis不理解&#xff0c;查看了官方文档&#xff0c;首先看到的是这个架构图&#xff0c;看…