【C++】认识C++(上)

目录

  • 从C到C++
  • 命名空间
    • 同名冲突
    • 命名空间的定义
    • 命名空间的使用
  • C++的输入和输出
  • 缺省参数(默认参数)

请添加图片描述

从C到C++

  C语言的出现是计算机科学和工程史上的一个重要里程碑,许多现代计算机语言都受C语言的影响。C语言是面向过程的,结构化和模块化的语言。 C语言的设计者必须细致地设计程序中的每一个细节,准确考虑程序运行时每一个步骤发生的事,但是随着计算机应用的推广,需要解决更多更复杂的问题,C语言就太适合了。
  于是乎,20世纪80年代,计算机界提出了面向对象的程序设计OOP(Object Orientde Programming)思想,由此支持面向对象的程序设计语言应运而生。
  1982年,AT&T Bell(贝尔)实验室的Bjarne Stroustrup博士及其同事在C语言的基础上引入并扩充了面向对象的概念,为了表达该语言与C语言的渊源关系,将其命名为C++。
  C++保留了C语言原有的主要优点,增加了面向对象的机制。 又因为C++是C发展而来的,与C兼容,用C语言编写的程序基本上可以不加修改的用于C++。C++是C的超集,可用于面向过程的结构化设计,但更多地用于面向对象的程序设计,是一种功能强大的混合型的程序设计语言
  下面就来走进C++,敲开C++的大门。

命名空间

同名冲突

  在C/C++中,变量,函数和C++中要学习到的类都是大量存在的。由于它们的大量存在,我们就喜欢将它们定义在全局作用域上,以方便修改。
  在实际生活中,通常会将一个项目分到几个小组去写,最后整合,这样时间效率都会增高。但是这就会出现一个问题,在整合项目的时候,可能会有些命名上的重复,导致程序报错。
  不仅如此,在程序设计中往往需要引用一些库(包括C++编译系统提供的库,以及开发者字节开发的库等等),为此需要包含有关头文件。如果在这些库中包含有与程序的全局实体同名的实体,或者不同库有相同的变量或函数或类的名字,就会在编译时出现名字冲突,也就是全局命名空间污染。 那么如何解决这个问题,C++中namespace 关键字的存在就是针对这种问题的。
  我们已经说了,写程序时容易发生命名冲突,则使用命名空间的目的就是对标识符的名称本地化,以避免命名冲突或文字污染。命名空间实际上就是一个由程序设计者命名的内存区域。所以一开始在学C语言的时候,我们就知道了有两个作用域,一个是全局域,另一个是局部域,现在加了这个命名空间以后,C++的一个程序上就会有三个域的存在

  1. 全局域
  2. 局部域
  3. 命名空间域

例如:

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

rand本身是一个库函数,用来生成随机值,要用的时候需要包含在头文件stdlib.h中。
而此时全局变量中又定义了一个rand,导致printf在输出时不知道应该调用库函数里面的rand,还是全局变量中的rand,此时就发生了命名冲突。
在这里插入图片描述

命名空间的定义

  定义命名空间,需要使用到namespace关键字,后面接着命名空间的名字,最后加一对{}即可,{}中即为命名空间的成员。命名空间中不止可以包括变量,还可以包括函数,结构体,类(后面会学习到),模板,命名空间(嵌套使用也可以)等,例如下面的例子:

namespace ns1
{int a = 1;//定义变量int Add(int x, int y)//定义函数{return x+y;}struct ListNode//定义结构体{int val;struct ListNode* next;};namespace ns2//嵌套了另一个命名空间{int sub(int x, int y){return x+y;}}
}

  还有值得要提的一点是,同一个工程中存在多个相同名称的命名空间,编译器最后都将会合成在同一个命名空间中。 就像你在北京有套房,在上海也有套房,那别人也就知道你是有两套房,都在你的名下。
如:

namespace ns1
{int a = 1;//定义变量int b = 2;
}namespace ns1
{int Add(int x, int y)//定义函数{return x + y;}
}

  最终编译器会认为是:

namespace ns1
{int a = 1;//定义变量int b = 2;int Add(int x, int y)//定义函数{return x + y;}
}

  命名空间所定义的命名空间域,将命名空间中的内容都局限于该命名空间中。

命名空间的使用

  我们介绍了如何去定义命名空间,下面来看看它是如何使用的。
  命名空间有三种使用方式:

  • 第一种方式:加命名空间名称及作用域限定符(在需要使用命名空间中的内容时再制定访问)
#include<stdio.h>
namespace ns1
{int a = 1;//定义变量int b = 2;
}
int main()
{
//    printf("%d\n", a);
//     这种直接想打印命名空间域里面的变量时编译器会报错
//     error C2065: “a”: 未声明的标识符printf("%d\n",ns1::a);return 0;
}

  我们发现在命名空间名字的后面有一个::符号,这叫做域作用限定符, 也就限定了内容在哪块查找。如:

#include<stdio.h>
int a = 10;
int main()
{int a = 20;printf("%d\n", a);   //打印的是局部域中的a是20printf("%d\n", ::a); //打印的是全局域中的a是10return 0;
}
  • 第二种方式:使用using将命名空间中某个成员引入

  即在程序中需要大量使用命名空间中的某一个成员时,每一次都去加上限定符比较麻烦,于是我们用using来制定展开某一个,例如:

#include<stdio.h>
namespace ns1
{int a = 1;//定义变量int b = 2;
}
using ns1::a;
int main()
{printf("%d\n", a);printf("%d\n", a);//此时我们使用a时就不用再加上限定符printf("%d\n", ns1::b);//我们只是展开了变量a,所以在使用b的时候还是要加上限定符return 0;
}
  • 第三种方式:使用using namespace命名空间名称引入

  使用了这个命名空间引入,可以将命名空间中的变量所有都展开来,后面在使用时都不需要加上限定符。例如:

#include<stdio.h>
namespace ns1
{int a = 1;//定义变量int b = 2;
}
using namespace ns1;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

  注意!:编译器在编译时对变量等的查找会有默认查找顺序,首先查找的是当前局部域,其次是全局域。
  只有命名空间被展开了,最后才会到这里面去找。

C++的输入和输出

  C语言的输入输出是有scanf和printf来控制的,而在C++中则是由cin和cout来控制。
  例如:

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

  结果如下:
在这里插入图片描述
  我们发现该程序进行了对a和b的输入并且打印输出操作。
在C++中,cout和cin是系统定义的对象名,cin是标准输入对象(键盘),cout是标准输出对象(控制台),(我们运行结果出来的框框就是控制台)。
  <<是流插入运算符,与cin配套使用,>>是流提取运算符,与cout配套使用。
  在C语言中,scanf和printf的使用需要包含头文件<stdio.h>,C++中也一样,在使用cin和cout时,需要包含头文件 < iostream>
  C++标准库中的类和函数时再命名空间std中声明的,如果需要使用C++标准库中的内容,就需要使用using namespace std来声明,表示要用命名空间std中的库函数
  使用C++的输入输出更加方便,不需要像printf/scanf那样,需要手动控制格式C++的输入输出可以自动识别变量类型。

  注意:
std是C++标准库的命名空间,应该如何去使用

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

缺省参数(默认参数)

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

  • 全缺省参数(全默认参数)
    也就是函数的形参全部给了默认值
#include<iostream>
using namespace std;
void func(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a;cout << " b = " << b;cout << " c = " << c << endl;
}int main()
{func(1, 2, 3);func(1, 2);func(1);func();return 0;
}

  运行结果如下:
在这里插入图片描述

  • 半缺省参数
#include<iostream>
using namespace std;
void func(int a , int b = 20, int c = 30)
{cout << "a = " << a;cout << " b = " << b;cout << " c = " << c << endl;
}int main()
{func(1, 2, 3);func(1, 2);func(1);return 0;
}

  运行结果如下:
在这里插入图片描述
  在使用缺省参数时有几个注意事项如下:

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

对于第2点的解释:
我们对一个函数进行声明和定义时,通常把声明放在.h文件中,定义放在.cpp文件中。
所以会出现:
xxx.h文件中函数声明:void func(int a = 10);
xxx.cpp文件中函数定义:void func(int a = 20){…}
此时两个位置提供的值不同,编译器就不知道该用那个缺省(默认)值,会报错。

  今天的内容到此结束啦,感谢大家观看,如果大家喜欢,希望大家一键三连支持一下,如有表述不正确,也欢迎大家批评指正。

请添加图片描述

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

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

相关文章

力扣HOT100 - 279. 完全平方数

解题思路&#xff1a; 动态规划 class Solution {public int numSquares(int n) {int[] dp new int[n 1];// 初始化dp数组&#xff0c;默认最坏情况是每个数都是由1相加得到的for (int i 1; i < n; i) {dp[i] i;}for (int i 1; i < n; i) {for (int j 1; j * j &…

Python Twisted库:异步网络编程的利器

更多Python学习内容&#xff1a;ipengtao.com 在现代网络应用开发中&#xff0c;异步编程已经成为一种必备的技能。Python Twisted库是一款强大的异步网络编程框架&#xff0c;它提供了丰富的工具和功能&#xff0c;使得开发者可以轻松地构建高性能的网络应用。 基本概念 Twist…

在虚机VirtualBox7.0.8安装Androidx86_64系统详细步骤要点

最近需要用到安卓系统蓝牙功能做测试&#xff0c;就选择了Virtualboxandroidx86方案&#xff0c;先把系统安装好&#xff0c;后面看是否可以比较好的完成蓝牙功能测试。如果可以的话&#xff0c;我会再发文分享下的&#xff0c;敬请期待。 1.准备材料 &#xff08;1&#xff…

Python API和微服务的测试库之httpretty使用详解

概要 在现代软件开发中,API和微服务的测试是确保应用稳定性和功能正确性的关键环节。Python的HTTPretty库提供了一个强大的工具,允许开发者在不实际发起网络请求的情况下模拟HTTP请求和响应。本文将全面介绍HTTPretty的安装、特性、基本与高级功能,并结合实际应用场景,展示…

企业如何利用美国多IP服务器来提升网站的安全性?

企业如何利用美国多IP服务器来提升网站的安全性? 在当前网络环境下&#xff0c;网站安全性日益成为企业面临的重要挑战。为了有效应对各种潜在威胁&#xff0c;越来越多的企业选择利用美国多IP服务器来提升其网站的安全性。这种服务器配置能够通过一系列策略来增加网站的安全…

5G NR 吞吐量计算 and 4G LTE 吞吐量计算

5G NR Throughput References • 3GPP TS 38.306 V15.2.0 (2018-06) ➤J : number of aggregated component carriers in a band or band combination ➤Rmax : 948/1024 • For the j-th CC, Vlayers(j) is the maximum number of layers ➤Qm(j) : Maximum modulation orde…

视频推拉流/视频直播点播平台EasyDSS使用Mysql数据库接口报错502如何处理?

视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能&#xff0c;具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务&#xff0c;全面满足超低延迟、超高画质、超大并发访…

meshlab: pymeshlab合并多个物体模型并保存(flatten visible layers)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

计算机视觉——OpenCV实现Lucas-Kanade 光流追踪

1.光流 光流法是计算机视觉中用于估计图像序列中物体运动的关键技术。它类似于观察夜空中的彗星&#xff0c;通过其在天空中的运动轨迹来追踪它的路径。在图像处理中&#xff0c;光流帮助我们理解像素点如何在连续的帧之间移动。 1.1 稀疏光流法 稀疏光流法关注于图像中的关…

tarjan学习

1.割点&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y是一个割点&#xff0c;x是y的一个子节点&#xff0c;当没有点x时&#xff0c;y无法访问其他点 2.割边&#xff08;必须经过&#xff09;&#xff1a;当时&#xff0c;y不经过这条边无法到达x&#xff0c…

默认成员函数:析构、深浅拷贝

析构函数 析构函数&#xff1a;与构造函数功能相反&#xff0c;析构函数不是完成对对象本身的销毁&#xff0c;局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数&#xff0c;完成对象中资源的清理工作。 特性 析构函数名时在类名前面加上字符~ class D…

Spring Bean的生命周期 五步 七步 十步 循序渐进

&#x1f468;‍&#x1f3eb; 参考视频地址 &#x1f496; 五步版 实例化 bean&#xff08;构造方法&#xff09;属性注入&#xff08;set() 方法&#xff09;初始化方法&#xff08;自定义&#xff09;使用bean销毁方法&#xff08;自定义&#xff09; &#x1f496; 七步版…

linux的 /usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别

/usr/sbin/nologin /sbin/nologin /bin/false /etc/nologin 的作用与区别 /usr/sbin/nologin /sbin/nologin /bin/false 这三者的作用几乎一样&#xff0c;都是禁止用户登录。 /usr/sbin/nologin /sbin/nologin 是同一个文件&#xff0c;通过软连接指向。 当把用户的bash设置…

生态系统类型分布数据、土地利用数据、植被类型分布、自然保护区分布数据

引言 全国自然保护区生态系统类型分布信息产品是指基于Landsat TM数字影像&#xff08;以地形图纠正&#xff09;&#xff0c;采用全数字化人机交互遥感快速提取方法&#xff0c;建立全国自然保护区生态系统结构数据集&#xff0c;同时做成多种尺度的栅格数据&#xff0c;其中包…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构&#xff1f;什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路&#xff1a; 1、堆结构 JVM的堆是运行时数据区&#xff0c;所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

美国站群服务器如何提高企业网站的负载均衡能力?

美国站群服务器如何提高企业网站的负载均衡能力? 美国站群服务器是企业提高网站负载均衡能力的重要工具之一。随着网络流量的增加和用户需求的多样化&#xff0c;如何有效地管理和分配流量成为了企业面临的挑战。通过采用美国站群服务器&#xff0c;企业可以实现流量的智能分…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的序列&#xff0c;每次比较相邻…

Dato for Mac v5.2.11激活版:掌握时间,掌控生活

在忙碌的生活中&#xff0c;您是否常常觉得时间不够用&#xff1f;Dato for Mac&#xff0c;您的时间管理专家&#xff0c;助您轻松掌控每一天。清晰的日历视图、个性化的提醒功能&#xff0c;让您的日程安排井井有条。无论是工作还是生活&#xff0c;Dato for Mac都能成为您的…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件&#xff08;提取人物姿态&#xff09; 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

vue下载文件,获取header头文件名乱码,下载文件名有下划线的解决

后台以数据流将文件返回&#xff0c;将文件名放在header头里&#xff0c;是中文名&#xff0c;有乱码&#xff0c;如图 访问网络使用的是axios&#xff0c;在 // 响应拦截器 service.interceptors.response.use((res) > {........ if (res.config.responseType blob) {//文…