C++入门(1)

目录

一、什么是C++

1、C++关键字(C++98)

2、C++兼容C

 二、C++程序预处理指令

三、命名空间 

1、命名冲突 

第一种:

第二种:

2、域作用限定符

3、实现命名空间 

4、命名空间冲突

5、访问命名空间

6、命名空间“std”

 四、输入输出

1、定义 

2、自动识别类型 

3、格式化输出

五、缺省参数

1、全缺省 

2、半缺省 


一、什么是C++

  • C++是一种高级程序设计语言,它是在C语言的基础上发展而来的。C++支持面向对象编程OOP(object oriented programming:面向对象)思想,这种编程方式可以更好地处理复杂问题和大规模程序的开发。
  • C++既可以进行C语言的过程化程序设计,也可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
  • 1982年,C++的设计者Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,使得C++成为一种功能强大、灵活性高、可扩展性好的编程语言。
  • C++的出现是为了解决软件危机,支持高度抽象和建模,适用于处理复杂问题和大规模程序的开发。C++还支持泛型编程和模板元编程,这使得C++成为一种非常灵活和强大的编程语言。

1、C++关键字(C++98)

C++总计63个关键字,C语言32个关键字。通过不断地学习我们会逐渐掌握这些关键字。

2、C++兼容C

使用C语言的语法在 .cpp 文件中依然可以运行。 

 二、C++程序预处理指令

#include <iostream>

C和C++一样,使用一个预处理器 在进行主编译之前对源文件进行处理,上述的编译指令使预处理器将 iostream 文件的内容添加到程序中。

那么什么要将 iostream 文件的内容添加到程序中呢?

  • 答案涉及程序与外部世界之间的通信。iostream 中的 io 指的是输入(进入程序的信息)和输出(从程序中发送出去的信息)。
  • C++的输入输出方案涉及 iostream文件中的多个定义。为了使用cout来显示消息,第一个程序需要这些定义。#include编译指令导致 iostream 文件的内容随源代码文件的内容一起被发送给编译器。
  • 实际上,iostream 文件的内容将取代程序中的代码行#include <iostream>。原始文件没有被修改,而是将源代码文件和 iostream 组合成一个复合文件,编译的下一阶段将使用该文件。
  • 注意:使用 cin(=scanf) cout(=printf) 进行输入和输出的程序必须包含文件iostrcam。
#include <iostream>
using namespace std;//后续讲解
int main()
{int a = 0;cin >> a;cout << a << endl;return 0;
}

 

三、命名空间 

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

1、命名冲突 

我们先来看一下命名冲突: 

大体命名冲突有两种: 

  1. 我们自己定义和库里面的名字冲突
  2. 项目组,多个人之间定义的名字冲突 

下面我们举例来解释两种情况的产生 。

第一种

我们定义一个全局变量rand,此时程序正常输出。

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

 

 如果我们包含头文件<stdlib.h>再次运行

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

此时程序无法正常运行,显示错误如下: 

 

这是因为<stdlib>头文件中定义了rand函数,当我们自己声明全局变量rand时,再包含头文件<stdlib.h> 就造成了 rand 的重定义

第二种

 我们在两个头文件中同时定义了Node结构体。

 然后主函数包含两个新创建的头文件,

#include <stdio.h>
#include "list.h"
#include "queue.h"int main()
{return 0;
}

编译一下,结果程序报错如下: 

由此可知,两个头文件包含相同的命名时,同时调用程序会报错。

为了解决这个问题,我们的大佬推出了命名空间的概念,对标识符的名称进行本地化,以避免命名冲突或名字污染。

2、域作用限定符

我们先来回顾“域”的概念: 

在C/C++中,域(Scope)是指程序中变量、函数、类等实体的可见范围和生命周期。根据实体的定义位置和作用范围,可以将域分为以下几种类型:

  1. 全局域(Global Scope):全局域中定义的变量、函数、类等实体在整个程序中都是可见的,它们的生命周期与程序的运行时间相同。在C/C++中,全局变量和全局函数默认情况下都属于全局域。

  2. 局部域(Local Scope):局部域中定义的变量、函数、类等实体只在其定义的代码块中可见,它们的生命周期与代码块的执行时间相同。在C/C++中,函数中定义的变量和函数参数都属于局部域。

这段代码中函数 f1 和函数 f2 中变量a都是域,int a = 2;是全局域。

#include<stdio.h>
int a = 2;void f1()
{int a = 0;
}
void f2()
{int a = 1;
}int main()
{printf("%d\n", a);return 0;
}

此时如何在函数 f1的局部域中打印全局域的变量 a 呢?

我们可以借助域作用限定符 :: (两个冒号) 实现,:: 左边为指定的域,不指定默认全局域。

int a = 2;
void f1()
{int a = 0;printf("%d\n",::a);  // ::域作用限定符
}

运行后,成功输出全局域的全局变量 2 。

3、实现命名空间 

定义命名空间需要关键字 namespace,分别为两个Node结构体定义名为 Q 和名为 L 的命名空间 .

然后在主函数中使用通过命名空间使用他们。 

#include <stdio.h>
#include "list.h"
#include "queue.h"
int main()
{struct Q::Node node1;struct L::Node node2;return 0;
}

我们声明了一个名为node1的 struct Q::Node 类型的变量,然后声明了一个名为node2的   struct L::Node 结构体类型的变量。由于这两个结构体都定义在不同的命名空间中,因此我们需要使用作用域解析运算符::来指定命名空间的名称。

我们对于重名的变量也可以放入不同的命名空间中,在两个命名空间中分别加入变量 x。 

 我也可以通过作用域解析运算符,访问不同命名空间中相同命名的变量。

int main()
{struct Q::Node node1;struct L::Node node2;Q::x++;L::x++;return 0;
}

4、命名空间冲突

 比如这种情况:

我们可以进行命名空间的嵌套。

我们对命名空间Code分别嵌套一层命名空间Q和L,这样就可解决命名空间冲突的问题,使用命名空间的内容时,只需多加一层域解析运算符。代码如下:

#include <stdio.h>
#include "list.h"
#include "queue.h"
int main()
{struct Code::Q::Node node1;struct Code::L::Node node2;Code::Q::x++;Code::L::x++;return 0;
}

 这种嵌套没有限制,可以进行多层嵌套。

C++中多个文件中相同的命名空间会被合并成一个命名空间。这是因为命名空间是C++中用于避免命名冲突的机制,它的作用是将一组相关的函数、类、变量等封装在一个命名空间中,以避免命名冲突和提高代码的可读性。

5、访问命名空间

  1.  指定命名空间访问
    struct Code::Q::Node node1;
    struct Code::L::Node node2;
  2.  全局展开. 一般情况,不建议全局展开的。
    #include "list.h"
    using namespace Code;
    int main()
    {struct L i;return 0;
    }
    但是一般情况下不建议全局展开,项目中禁止,平时练习可以。
  3. 部分展开
    using std::cout;
    using std::endl;int main()
    {cout << "1111" << endl;return 0;
    }

6、命名空间“std”

#include <iostream>
using namespace std;
int main()
{int a = 0;cin >> a;cout << a << endl;return 0;
}

std是一个命名空间,它包含了许多标准库函数和对象,例如coutcin。命名空间的作用是为了避免不同库中的函数或对象名称冲突,因此在使用标准库中的函数和对象时,

  • 如果不使用 using namespace std;语句,需要在前面加上std::前缀,以指明它们属于std命名空间。
  • 如果使用 using namespace std;语句可以让我们直接使用这些函数和对象,而不需要加上std::前缀。

 四、输入输出

1、定义 

  • 使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。
  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
  • iostream >头文件中。
  • <<是流插入运算符,>>是流提取运算符
#include <iostream>
using namespace std;
int main()
{int a;cin >> a;cout << a << endl;return 0;
}

2、自动识别类型 

  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
  • C++的输入输出可以自动识别变量类型。
#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;double* a = (double*)malloc(sizeof(int) * n);for (int i = 0; i < n; i++){cin >> a[i];}for (int i = 0; i < n; i++){cout << a[i] << endl;}return 0;
}

3、格式化输出

 这种情况用cout输出就显得有些麻烦,此时用C语言的printf进行格式化输出就方便许多。

int main()
{char name[100] = "Kelly";int age = 20;cout << "name:" << name << endl;cout << "age:" << age << endl;printf("name:%s\nage:%d\n", name, age);return 0;
}

五、缺省参数

C++ 可以在函数定义时对参数赋初始值,调用时可以不对函数传值,输出则为参数的初始值。

void func(int a = 0)
{cout << a << endl;
}
int main()
{func();return 0;
}

如果对函数传值,则函数使用传入值。

func(666);

1、全缺省 

 使用缺省值,必须从右往左连续使用。

void Func(int a = 1, int b = 2, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
int main()
{Func(4, 5, 6);Func(4, 5);Func(4);Func();return 0;
}

 输出结果如下:

2、半缺省 

 必须从右往左连续缺省。

void Func(int a , int b = 2, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
int main()
{Func(4, 5, 6);Func(4, 5);Func(4);//Func(); 至少传一个值给areturn 0;
}

这种就不可以 ,不符合从右往左连续缺省。

void Func(int a = 0, int b , int c = 3)

 注意!

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

 Visual Studio可能没有报错,是因为它的编译器对这种情况进行了特殊处理,将函数声明和定义中的缺省参数合并起来,但是,这种行为并不是所有编译器都支持,因此在编写跨平台的代码时,最好避免在函数声明和定义中同时指定缺省参数,以函数声明中指定的缺省参数为准。

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

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

相关文章

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测&#xff1f; 滑动窗口&#xff08;Sliding Window&#xff09; 滑动窗口的效率问题和改进 滑动窗口的效率问题&#xff1a;计算成本很大 改进思路 1&#xff1a;使用启发式算法替换暴力遍历 例如 R-CNN&#xff0c;Fast R-CNN 中使用 Selectiv…

activiti命令模式与责任链模式

来源&#xff1a;activiti学习&#xff08;七&#xff09;——命令模式和职责链模式在activiti中的应用 文章目录 设计模式命令模式CommandHelloCommandByeCommand ReceiverInvokerClient 职责链模式AbstractHandlerConcreteHandlerAConcreateHandlerB Client activiti中很多ap…

SQLServer添加Oracle链接服务器

又一次在项目中用到了在SQLServer添加Oracle链接服务器&#xff0c;发现之前文章写的也不太好使&#xff0c;那就再总结一次吧。 1、安装OracleClient 安装64位&#xff0c;多数SQLServer是64位&#xff0c;所以OracleClient也安装64位的&#xff1b; 再一个一般安装的Oracl…

demo(一)eureka----服务注册与提供

下面写一个简单的demo验证下eureka&#xff0c;实现服务注册、服务发现。 一、单节点&#xff1a; 1、api&#xff1a; 封装其他组件需要共用的dto 2、eureka-service服务注册中心&#xff1a; &#xff08;1&#xff09;pom: <?xml version"1.0" encoding&q…

主从复制和读写分离

MySQL 主从复制和读写分离&#xff1a; 主从复制&#xff1a;主MySQL上的数据&#xff0c;新增&#xff0c;修改库&#xff0c;表&#xff0c;表里的数据&#xff0c;都会同步到从MySQL上。 MySQL的主从复制的模式&#xff1a;&#xff08;面试题&#xff09; 1&#xff0c;异…

【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象

process对象是一个全局对象&#xff0c;提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例&#xff0c;因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的process对象事件&…

3.4 Linux 软件管理

一. RPM 软件包管理器 1、软件包介绍 RPM&#xff08;RedHat Package Manager&#xff09;软件包&#xff1a;扩展名为“.rpm”。RPM本质上就是一个包&#xff0c;包含可以立即在特定机器体系结构上安装和运行的Linux软件。安装RPM软件包需要使用rpm命令或yum命令。 源代码软…

荧光量子效率积分球的优势是什么

荧光量子效率积分球是一种测量设备&#xff0c;可以用于测量荧光材料在特定波长下的量子效率。它由一个具有高朗伯特性的漫反射PTFE材料制成&#xff0c;具有高达99%的反射率和朗伯特性。积分球有三个开口&#xff0c;分别为光入射口、样品口和光出射口。光入射口设置有一准直镜…

windows10上使用Visual Studio对树莓派进行交叉编译示例

本文主要介绍通过Visual Studio对树莓派进行交叉编译的方法。 1 环境 宿主机&#xff1a; 系统&#xff1a;Windows10 开发平台&#xff1a;Visual Studio 2022 (我用的是社区版) VisualGDB: VisualGDB - Download (我下的试用版本) GNU工具链: Prebuilt GNU toolchain f…

表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序

目录 表白墙引入数据库 再谈Cookie和session 得到Cookie ​编辑 设置Cooie 使用Cookie编写一个登入的小界面 表白墙引入数据库 1.先引入数据库的依赖&#xff08;驱动包&#xff09;&#xff0c;5.1.49 pom.xml中&#xff0c;在之前的两个之前&#xff0c;再去添加一个 &…

【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装

CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包&#xff0c;这里以11.7为例。 打开安装包&#xff0c;在安装选项选择自定义模式&#xff0c;点击下一步。 在自定义安装选项中&#xff0c;仅选择CUDA组件&#xff08;其中Nsight相关组件用于代码调试与性能分析&#xff…

HarmonyOS分布式文件系统开发指导

分布式文件系统概述 分布式文件系统&#xff08;hmdfs&#xff0c;HarmonyOS Distributed File System&#xff09;提供跨设备的文件访问能力&#xff0c;适用于如下场景&#xff1a; 两台设备组网&#xff0c;用户可以利用一台设备上的编辑软件编辑另外一台设备上的文档。平板…

CKA认证模块②-K8S企业运维和落地实战-2

CKA认证模块②-K8S企业运维和落地实战-2 K8S常见的存储方案及具体应用场景分析 k8s存储-empty emptyDir类型的Volume是在Pod分配到Node上时被创建&#xff0c;Kubernetes会在Node上自动分配一个目录&#xff0c;因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容…

计算机网络之网络体系结构

计算机网络体系结构 一、常见的计算机体系结构 1.1 OSI标准以及TCP/IP体系结构 OSI标准失败的原因&#xff1a; OSI的专家们缺乏实际经验&#xff0c;他们在完成OSI标准时没有商业驱动力OSI的协议实现起来过分复杂&#xff0c;而且运行效率很低OSI标准的制定周期太长&#x…

css:文本对齐属性vertical-align实现化学元素上标下标的显示

文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/vertical-align 语法 vertical-align: <value>;可选值&#xff1a; sub&#xff1a;使元素的基线与父元素的下标基线对齐。 super&#xff1a;使元素的基线与父元素的上标基线对齐。 text-top&#xff1a;使…

JAVA 中集合取交集

日常工作 经常需要取两个数据集的交集。对常用的List 和Set集合做了一个测试 public static void main(String[] args) {List<Integer> list1 Lists.newArrayList();List<Integer> list2 Lists.newArrayList();Set<Integer> set3 Sets.newHashSet();Set&l…

基于SSM的药店药品销售系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

程序员的护城河

程序员的护城河是一个多维度的概念&#xff0c;它包括技术能力的深度、对创新的追求、沟通协作等软实力。这些因素共同构成了程序员在保障系统安全、数据防护以及网络稳定方面所起到的重要作用。 首先&#xff0c;技术能力的深度是程序员的核心竞争力之一。随着科技的不断发展…

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC&#xff1a;Remote Procedure Call&#xff0c;远程过程调用。 远程过程调用是一种进程间通信&#xff0c;它允许计算机程序在另一个地址空间中执行子程序&#xff0c;就好像用别人的东西像用自己的一样&#xff0c;常用于分布式系统。 远程过程调用…

3分钟带你了解前端缓存-HTTP缓存

前情提要 前端缓存分为下面三大类&#xff0c;本文主要讲解HTTP缓存~ 1. HTTP缓存 强缓存协商缓存 2. 浏览器缓存 本地小容量缓存本地大容量缓存 3. 应用程序缓存 HTML5应用程序缓存 缓存作用 减少了冗余的数据传输减少服务器的负担提高了网站的性能加快加载网页速度 …