C++基础入门——语法详解篇(上)

news2025/1/8 18:53:26

文章目录

一、什么是 C++ 呢?

二、为什么要学 C++ 呢?

三、C++ 基础语法

3、1 C++ 关键字

3、2 命名空间

3、2、1 为什么要引入命名空间

3、2、2 命名空间的定义

3、2、3 命名空间的使用

3、3 C++的输入和输出

3、4 函数重载

3、4、1 函数重载的概念

3、4、2 C++支持函数重载的原理


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:C++ 👀

💥 标题:C++基础语法 💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

  本篇文章是对C++的初学者语法进行了详解。也可以理解为从C语言转换到C++的使用必须要学的基础语法的转换。有很多人有所疑问:什么是C++呢?为什么要学C++呢?我们接下来会给出解答的。

一、什么是 C++ 呢?

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

二、为什么要学 C++ 呢?

  这里给大家简单总结一下为什么要学C++,也就是C++的重要性:

  • 首先,C++基于C语言扩充了一些语法,引入并扩充了面向对象的概念,支持面向对象。同时C++兼容C语言;
  • 语言使用的广泛度较高;
  • 在工作领域应用范围较广;
  • 校招的重视度较高。

  以上是较为重要的原因。我们也应该认识到C++的重要性。接下来我们直接进入如法的讲解。

三、C++ 基础语法

3、1 C++ 关键字

  C++总计63个关键字,C语言32个关键字。这里我们发改了解一下都有哪些关键字,不在进行详细讲解。

3、2 命名空间

3、2、1 为什么要引入命名空间

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

3、2、2 命名空间的定义

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

  代码如下:

namespace namespace_name
{
    //空间成员
    ......
}

  其中在命名空间中可以声明变量、函数、类型等。代码如下:

namespace bit
{
    int rand = 10;

    int Add(int left, int right)
    {
        return left + right;
    }

    struct Node
    {
        struct Node* next;
        int val;
    };
}

  命名空间也可以嵌套命名空间,代码如下: 

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;
        }

    }

}

  同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。例如,上述的嵌套的命名空间中,我们声明了N1的命名空间。当我们再次独立声明一个命名空间N1时,编译器自动会将这两个同名的命名空间N1合并为一个

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

3、2、3 命名空间的使用

  命名空间该如何使用呢?命名空间的使用有三种方式:

  • 加命名空间名称及作用域限定符;
  • 使用 using 将命名空间中的某个成员引入;
  • 使用 using namespace 命名空间名称 将该命名空间的所有成员引入。

  我们具体可看如下例子:

//有一个命名空间N
//加命名空间名称及作用域限定符
int main()
{
 printf("%d\n", N::a);
 return 0; 
}

//使用using将命名空间中某个成员引入
using N::b;
int main()
{
 printf("%d\n", N::a);
 printf("%d\n", b);
 return 0; 
}

//使用 using namespace 命名空间名称 引入
using namespce N;
int main()
{
 printf("%d\n", N::a);
 printf("%d\n", b);
 Add(10, 20);
 return 0; 
}

  我们经常可以看到 using namespace std。学完上面的内容后我们知道 std 是一个命名空间的名称。std 是 s tan dard 的缩写,意思是“标准命名空间”。当然我们也可不直接展开整个 std 命名空间,我们也可用 std::变量名称 进行局部展开,用到某个变量或函数。

  std命名空间的使用惯例:

  • 在日常练习中,建议直接using namespace std即可,这样就很方便。
  • using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

3、3 C++的输入和输出

  C++的输入和输出相对C语言更新了和更加便捷了。我们先看一个例子:

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

  我们看到上面有 cin 、 cout 和 endl 三个”新东西“,这里给大家解释一下:

  • 使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名 空间使用方法使用std。
  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  • <<是流插入运算符,>>是流提取运算符
  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。

3、4 函数重载

3、4、1 函数重载的概念

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

#include<iostream>

using namespace std;

// 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;
}

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

void f(int a)
{
    cout << "f(int a)" << endl;
}

// 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()
{
    Add(10, 20);
    Add(10.1, 20.2);
    f();
    f(10);
    f(10, 'a');
    f('a', 10);
    return 0
}

  其运行结果如下图:

3、4、2 C++支持函数重载的原理

  我们知道C语言是不支持函数重载的,那为什么C++支持函数重载呢?其中的细节又是什么呢?接下为大家简述一下其中的细节。

  我们直到,在C/C++中一个程序要运行起来,需要经历预处理、编译、汇编、链接四个阶段。如果一切正常,最终会生成一个可执行程序。每个阶段都做了什么事情呢?

  这里的关键就是在链接阶段。链接阶段时处理那些事情呢?我们分为一下几点:

  1. 实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,当前a.cpp中调用了b.cpp中定义的Add函数时,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
  2. 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
  3. 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则

  重点来了,C++中在链接阶段引入了函数名修饰规则,这样就可以区分相同函数名不同形参的函数了。链接阶段的函数名修饰规则是什么呢?我们接着往下看。

  这里我们需要在Linux环境下看其汇编代码,比较容易观察:

  通过上图,我们可大致发现在linux下通过g++编译后的函数修饰后变成:_Z+函数长度+函数名+型首字母。

   通过这种函数名修饰规则我们就可以很好的区分相同函数名不同形参的函数了。在链接阶段,也很容易找到各自对应的地址。这就是C++支持函数重载的根本原因

  由于内容稍多,本篇文章暂时讲解到这里。后续会给大家更新出下篇文章,对基础语法讲解完毕。希望本篇文章会对你有所帮助,感谢观看ovo~

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

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

相关文章

【WAF】雷池安装及使用体验

文章目录 前言一、雷池介绍二、安装及使用1.下载链接2.下载3. 安装waf测试 前言 长亭一直是我比较喜欢的一家公司&#xff0c;像业界比较出名的扫描器xray还有rad等很多工具都是他们开发的&#xff0c;使用起来非常的nice&#xff0c;联动其他安全工具可以实现自动漏洞挖掘&am…

掌玩科技×OceanBase:HTAP实时数据分析,降低80%存储成本

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 近日&#xff0c;新兴游戏公司海南掌玩网络科技有限公司&#xff08;以下简称“掌玩科技”&#xff09;正式牵手原生分布式数据库 OceanBase&#xff0c;其投放系统、用户分析系统、数据系统、运营…

beef-xss浏览器劫持

beef-xss浏览器劫持 一&#xff0c;实验拓扑图二&#xff0c;租用一台阿里云&#xff0c;搭建docker环境和beef环境1.租一台阿里云服务器&#xff0c;系统选用ubuntu&#xff0c;计时收费的那种&#xff0c;一个小时几毛钱2.开启策略组3000端口&#xff0c;5000端口4.安装docke…

wait/notify使用详解

1. 使用注意事项 wait/notify(All)可用于线程间(线程数量>3)通信 永远在synchronized方法或对象里使用wait/notify(All),不然JVM报java.lang.IllegalMonitorStateException 永远在while循环里使用wait&#xff0c;防止其他原因改变先前判断条件 永远在线程间共享对象(生产…

直流有刷电机的电路分析

这里写目录标题 H桥改进后的电路L298N原理图野火的电机驱动板MOS管野火的原理图 H桥 当 Q1 和 Q4 导通时&#xff0c;电流将经过 Q1 从左往右流过电机&#xff0c;在经过 Q4 流到电源负极&#xff0c;这时图中电机可以顺时针转动。 当 Q3 和 Q2 导通时&#xff0c;电流将经过 Q…

【AI算法学习】基于AutoEncoder的生成对抗网络

基于AutoEncoder的生成对抗网络&#xff1a;VAE-GAN AutoEncoderVAEGANVAE-GANDCGANInfoGANss-InfoGAN论文链接 " 生成模型&#xff08;Generative modeling&#xff09;"已成为机器学习的一个较为广泛的领域。在图像这种流行数据上&#xff0c;每张图像都有数千数万…

服务(第七篇)nginx优化

隐藏版本号&#xff1a; 方法①&#xff1a; 修改配置文件&#xff1a; 检测&#xff1a;版本号没有了 方法②&#xff1a; 首先修改nginx.h文件&#xff0c;修改版本号和服务名&#xff1a; 然后切换到/opt/nginx-1.18.0进行编译安装&#xff1a; 安装后进入nginx.conf进行…

Redis缓存实战(2)

目录 缓存定义 Redis缓存实战 1删除缓存还是更新缓存&#xff1f; 2如何保证缓存与数据库的操作同时成功或者失败&#xff1f; 3先操作数据库还是缓存&#xff1f; 缓存问题 缓存穿透 缓存雪崩 缓存击穿 缓存定义 缓存&#xff08;Cache)是数据交换的缓冲区&#xff0…

微信小程序自动化测试实战教程,框架源码应有尽有

目录 1. 微信小程序自动化测试介绍 2. 搭建微信小程序自动化测试框架 步骤1&#xff1a;选择测试工具 步骤2&#xff1a;搭建测试环境 步骤3&#xff1a;编写测试脚本 步骤4&#xff1a;执行测试 3. 实现微信小程序自动化测试的关键技术 技术1&#xff1a;微信小程序自动…

Netty:常见的面试题和答案

1. 什么是Netty&#xff1f; 答&#xff1a;Netty是一个高性能的网络编程框架&#xff0c;基于NIO的非阻塞式IO模型&#xff0c;可以帮助开发者快速开发高性能、高可靠性的网络应用程序。 2. Netty的核心组件有哪些&#xff1f; 答&#xff1a;Netty的核心组件包括&#xff…

GPT-3模型简单介绍

目录 一、概要 二、深入扩展 一、概要 与T5模型( Text-to-Text Transfer Transformer&#xff0c;详见文末链接 &#xff09;相似&#xff0c;OpenAI提出的GPT-3模型&#xff08;第三代GPT&#xff09;也是通过将不同形式的自然语言处理任务重定义为文本生成实现模型的通用化。…

【面试】一文读懂Java类加载全过程

文章目录 一、概述1. 类加载器2. 加载阶段3. 验证阶段4. 准备阶段5. 解析阶段6. 初始化阶段类加载过程总结 二、相关问题Q: 什么是类加载&#xff1f;Q: Java中有哪些类加载器&#xff1f;Q: 类加载的过程包括哪些步骤&#xff1f;Q: 类加载器的双亲委派模型是什么&#xff1f;…

告别StringUtil:使用Java的全新String API优化你的代码

前言 Java编程语言每一次主要更新&#xff0c;都引入了许多新功能和改进。 并且在String 类中引入了一些新的方法&#xff0c;能够更好地满足开发的需求&#xff0c;提高编程效率。 repeat(int count)&#xff1a;返回一个新的字符串&#xff0c;该字符串是由原字符串重复指定…

Jetson TX1 /TX2 对比介绍

大家好&#xff0c;我是虎哥&#xff0c;经过一段时间的整理&#xff0c;针对TX1/TX2这些看起来已经落伍的产品&#xff0c;如何找到合适的应用场景&#xff0c;我也整体上做了一些了解好调研。现在由于资料很多都比较老了&#xff0c;有些表述也有些前后表述不一&#xff0c;所…

ClickHouse环境搭建

目录 1 ClickHouse 的安装1.1 准备工作1.1.1 确定防火墙处于关闭状态1.1.2 CentOS 取消打开文件数限制1.1.3 安装依赖1.1.4 CentOS 取消 SELINUX 1.2 单机安装1.2.1 在 hadoop102 的/opt/software 下创建 clickhouse 目录1.2.2 将安装文件上传到 hadoop102 的software/clickhou…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的伽马变换校正算法增强(C++)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCV实现图像的伽马变换校正算法增强&#xff08;C&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调…

第三章 作业(7BF)【计算机系统结构】

第三章 作业&#xff08;7BF&#xff09;【计算机系统结构】 前言推荐第三章 作业&#xff08;7BF&#xff09;71115鲲鹏流水线调研华为鲲鹏处理器ARM体系的总体思想ARM的流水线结构 最后 前言 2023-4-10 18:49:41 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐…

上一次c语言多文件处理代码的改进和总结

先看看上一次的文件&#xff1a; (3条消息) 认真复习c语言1_穿花云烛展的博客-CSDN博客 对于有重复结构体定义但是并不会报错&#xff0c;只是难以修改而已&#xff1a;为了解决这个一改就要改两次的情况&#xff0c;这里有一个解决方案&#xff1a; 上面的代码是可以运行的&…

常见的Web攻击技术

文章目录 前言HTTP 不具备必要的安全功能在客户端即可篡改请求针对 Web 应用的攻击模式 因输出值转义不完全引发的安全漏洞跨站脚本攻击XSSXSS实例 SQL 注入攻击实例 HTTP 首部注入攻击HTTP 首部注入攻击案例HTTP 响应截断攻击 因会话管理疏忽引发的安全漏洞会话劫持会话固定攻…

Java企业级开发学习笔记(2.2)利用MyBatis实现CRUD操作

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/ajSEO】 文章目录 一、准备工作二、查询表记录2.1 在映射器配置文件里引入结果映射元素2.2 添加按姓名查询用户记录功能2.2.1 添加按姓名查询的映射语句2.2.2 添加按姓名查询用户记录的测试方法2.…