C++新经典06-- 语言特性

news2024/11/22 22:03:26

1.继承性、多态性、封装性。

2.C++本身是属于编译型语言。

什么叫编译型语言呢?程序在执行之前需要一个专门的编译过程,把程序编译成二进制文件(可执行文件),执行的时候,不需要重新翻译,直接使用编译的结果就行了。

相对于编译型语言,还有解释型语言。解释型语言编写的程序不进行预先编译,以文本方式存储程序代码。但是,在执行程序的时候,解释型语言必须先解释再执行。

显然,编译型语言执行速度快,因为它不需要解释。而像Lua等语言,就属于解释型语言。

3.命名空间简介

命名空间就是为了防止名字冲突而引入的一种机制。系统中可以定义多个命名空间,每个命名空间都有自己的名字,不可以同名。可以把命名空间看成一个作用域,这个命名空间里定义的函数与另外一个命名空间里定义的函数,即便同名,也互不影响(因为命名空间名不同)。

(1)命名空间定义:
在这里插入图片描述

(2)命名空间定义可以不连续,可以写在不同的位置,甚至写在不同的源文件中。如果以往没有定义该命名空间,那么这就相当于定义了一个命名空间,如果以往已经定义了该命名空间,那这就相当于打开已经存在的命名空间并为其添加内容。
(3)外界访问某个命名空间中的实体的方法:访问格式如下,其中两个冒号叫“作用域运算符”:
在这里插入图片描述

看看如下范例,现在希望在main函数中调用命名空间NMZhangSan中的radius函数:

//MyProject.cpp源文件代码如下
namespace NMZhangSan    //定义命名空间
{
    void radius(){
     printf("MZhangSan::radius函数被执行\n");
    }
}

int main()  //主函数
{
    NMZhangSan::radius();  //调用MZhangSan命名空间下的radius函数
}

现在将MyProject2.cpp加入到当前项目中来:

namespace NMLiSi
{
	void radius()
	{
		printf("NMLiSi::radius函数被执行.\n");
	}
}

此时,希望也在main函数中调用NMLiSi命名空间下的radius函数,于是在main函数中增加如下代码:

 NMLiSi::radius(); 

但是,编译出错,无法调用成功,系统不认识NMLiSi命名空间下的radius函数。为什么?

· 在main中调用NMZhangSan::radius之所以成功,是因为该函数和main函数处于同一个文件(MyProject.cpp)中。
· 但是NMLiSi::radius函数却在MyProject2.cpp文件中,所以main中调用NMLiSi::radius会失败(因为缺少该函数的声明)。

为了能够调用成功NMLiSi::radius,就需要对源代码进行细致认真的组织,组织得好,看起来和用起来就都方便,也能够体现出开发者的整体开发素质,所以,请读者一定要重视源代码的组织。该如何进行源代码的组织呢?

(1)把函数声明,包括以后学习类,要把类的定义等内容放到一个头文件中。这里新建立一个MyProject2.h的头文件,内容如下:

namespace NMLiSi
{
	void radius();  //函数声明
}   

(2)在MyProject.cpp文件开头增加如下代码把MyProject2.h这个头文件包含进来:

#include "MyProject2.h"

再次编译链接整个项目,成功,并能够正确执行。

(3)现在在main函数中可以成功调用NMLiSi::radius函数,但是每次调用都要在函数名之前写NMLiSi::前缀,感觉比较多余。是否可以简化书写,当然是可以的,通过using namespace来声明NMLiSi这个命名空间,声明后,调用NMLiSi命名空间中的函数就不再需要使用NMLiSi::前缀了。usingnamespace的使用格式如下:
在这里插入图片描述

现在在MyProject.cpp源文件中的main函数之前加入如下代码:

using namespace NMLiSi;		//声明NMLiSi命名空间

此时,把main函数中的“NMLiSi::radius();”修改为“radius();”,发现也能正确地调用NMLiSi命名空间中的radius函数。

(4)试想,现在在“usingnamespaceNMLiSi;”代码行的下面增加如下代码行,会出现什么情况呢?

using namespace NMZhangSan;		//声明NMZhangSan命名空间

此时编译代码,就会报错,报错的源头是main函数中的“radius();”代码行。因为在NMZhangSan命名空间和NMLiSi命名空间中都包含radius函数,而通过usingnamespace既声明了NMLiSi命名空间又声明了NMZhangSan命名空间,此时,系统就无法分辨出到底调用NMLiSi命名空间中的radius函数还是NMZhangSan命名空间中的radius函数。所以,①要么不要同时声明两个命名空间;②要么不同命名空间中的函数不要同名;③要么调用radius函数时增加诸如“NMLiSi::”前缀。

基本输入/输出精解

C++中输入/输出用的标准库是iostream库(输入/输出流)。什么叫流?流就是一个字符序列。

基本输出 std::cout

(1)std:这是标准库中定义的一个命名空间,请读者记住这个名字。
(2)cout:是一个对象,一个与iostream相关的对象。cout对象被称为“标准输出”,一般用于向屏幕输出一些内容,索性把cout当成屏幕也是可以的。

std::endl是一个函数模板名,相当于函数指针,建议暂时理解成函数,以后会详细讲解函数模板。有两点可以总结一下:
(1)一般来讲,能看到std::endl的地方都有std::cout的身影。
(2)std::endl一般都在语句的末尾,有两个作用。
· 输出换行符\n。
· 刷新输出缓冲区,调用flush(理解成函数)强制输出缓冲区中所有数据(也叫刷新输出流,目的就是显示到屏幕),然后把缓冲区中数据清除。

什么叫输出缓冲区?可以理解成一段内存,使用std::cout输出的时候实际上是往输出缓冲区中输出内容。那么输出缓冲区什么时候把内容输出到屏幕上呢?有如下几种情况:
(1)缓冲区满了。
(2)程序执行到main函数中的return,要正常结束了。
(3)使用std::endl了,因为使用后会调用flush()。
(4)系统不太忙的时候,会查看缓冲区内容,发现新内容就正常输出。所以有时使用std::cout时,语句行末尾是否增加std::endl都能将信息正常且立即输出到屏幕。
(5)可能还有其他情况,这里不做进一步探讨。

读者可能还有一个疑问,为什么要有这个输出缓冲区?用std::cout直接输出信息到屏幕时,缓冲区的作用体现的不太明显,那如果是输出信息到一个文件中,那么输出缓冲区作用就明显了,总不能输出一个字符,就写一次文件,因为文件是保存在硬盘上,速度和内存比实在是慢太多了,所以很有必要将数据临时保存到输出缓冲区,然后一次性地将这些数据写入硬盘。

基本输入

cin也是一个对象,被称为“标准输入”。在C语言部分曾经讲过scanf函数,用于从键盘输入一些数据,在C++中,cin对象同样能够做这件事。

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

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

相关文章

shell脚本中linux命令的特殊用法记录

shell脚本中linux命令的特殊用法记录 1、linux命令特殊参数选项1.1、sed -e1.2、echo -e 2、 shell 扩展2.1、[[ ]]支持用~进行正则匹配 3、特殊命令用法3.1、{} 变量替换 1、linux命令特殊参数选项 1.1、sed -e sed -e以严格模式执行脚本,在sed -e 后面的所有命令…

反转链表II

江湖一笑浪滔滔,红尘尽忘了 题目 示例 思路 链表这部分的题,不少都离不开单链表的反转,参考:反转一个单链表 这道题加上哨兵位的话会简单很多,如果不加的话,还需要分情况一下,像是从头节点开始…

【Apollo学习笔记】——规划模块TASK之PATH_BORROW_DECIDER

文章目录 前言PATH_BORROW_DECIDER功能简介PATH_BORROW_DECIDER相关配置PATH_BORROW_DECIDER总体流程PATH_BORROW_DECIDER相关子函数IsNecessaryToBorrowLaneIsBlockingObstacleFarFromIntersectionIsNonmovableObstacleCheckLaneBorrow 参考 前言 在Apollo星火计划学习笔记—…

MySql014——分组的GROUP BY子句和排序ORDER BYSELECT子句顺序

前提:使用《MySql006——检索数据:基础select语句》中创建的products表 一、GROUP BY子句基础用法 SELECT vend_id, COUNT(*) AS num_prods FROMstudy.products GROUP BY vend_id;上面的SELECT语句指定了两个列,vend_id包含产品供应商的ID&…

Protobuf 语法详解

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

mybatisplus批量写入

1.新建MybatisPlusConfig /*** MybatisPlusConfig.*/ Configuration MapperScan("com.test.mapper") public class MybatisPlusConfig {/*** 自定义批量插入 SQL 注入器.*/Beanpublic InsertBatchSqlInjector insertBatchSqlInjector() {return new InsertBatchSqlI…

微服务(多级缓存)

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&…

【Kubernetes】Kubernetes的监控工具Promethues

Prometheus 一、Prometheus 概念1. Prometheus 概述2. Prometheus 的监控数据3. Prometheus 的特点4. Prometheus 和 zabbix 区别5. Prometheus 的生态组件5.1 Prometheus server5.2 Client Library5.3 Exporters5.4 Service Discovery5.5 Alertmanager5.6 Pushgateway5.7 Graf…

【PHP面试题81】php-fpm是什么?它和PHP有什么关系

文章目录 🚀一、前言,php-fpm是什么🚀二、php-fpm与PHP之间的关系🚀三、php-fpm解决的问题🔎3.1 进程管理🔎3.2 进程池管理🔎3.3 性能优化🔎3.4 并发处理 🚀四、php-fpm常…

每日一题——排序链表(递归 + 迭代)

排序链表(递归 迭代) 题目链接 注:本体的解法建立在归并排序的基础之上,如果对这一排序还不太了解,建议看看: 👉归并排序 👉八大排序算法详解 👉合并两个有序链表 既…

初学Zephyr系统,相关文档参考

https://docs.zephyrproject.org/3.0.0/reference/kconfig/index-all.html Zephyr下所有配置项Configuration Options 链接如上,写个博客防止自己找不到 我在调试NCS中的例程的时候会需要对prj.conf进行配置从而对Kconfig进行配置 BLE的相关API可参考https://do…

[oneAPI] 基于BERT预训练模型的英文文本蕴含任务

[oneAPI] 基于BERT预训练模型的英文文本蕴含任务 Intel DevCloud for oneAPI 和 Intel Optimization for PyTorch基于BERT预训练模型的英文文本蕴含任务语料介绍数据集构建 模型训练 结果参考资料 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0…

Spring@Scheduled定时任务接入XXL-JOB的一种方案(基于SC Gateway)

背景 目前在职的公司,维护着Spring Cloud分布式微服务项目有25个。其中有10个左右微服务都写有定时任务逻辑,采用Spring Scheduled这种方式。 Spring Scheduled定时任务的缺点: 不支持集群:为避免重复执行,需引入分…

基于jeecg-boot的flowable流程加签功能实现

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 今天我…

【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

文章目录 一、变量的本质 - 引入 " 引用 " 概念1、变量的本质 - 内存别名2、引入 " 引用 " 概念 - 已定义变量的内存别名3、" 引用 " 的优点 二、引用语法简介1、语法说明2、代码示例 - 引用的定义和使用 三、引用做函数参数1、普通引用必须初始…

minikube安装

minikube也是需要docker环境的,首先看一下docker 下载docker.repo源到本地 通过repo里面查找最新的docker 开始安装docker 修改docker 下载加速地址, systemctl deamon-reload 下载minikube minikube start | minikube curl -LO https://storage.goog…

Mybatis(二)映射文件配置与动态SQL

Mybatis(二)映射文件配置 1.Mybatis映射文件配置 1.入参 1.1.parameterType(了解) CRUD标签都有一个属性parameterType,底层的statement通过它指定接收的参数类型。入参数据有以下几种类型:HashMap,基本数据类型&a…

会计资料基础

会计资料 1.会计要素及确认与计量 1.1 会计基础 1.2 六项会计要素小结 1.3 利润的确认条件 1.3.1 利润的定义和确认条件 1.4 会计要素及确认条件 2.六项会计要素 2.1 资产的特征及其确认条件 这部分资产可以给企业带来经济收益,但是如果不能带来经济利益&#xff…

提升团队合作效率:企业网盘的文件管理和协作利用方法

随着信息技术的飞速发展,企业越来越依赖于网络和云服务来提高工作效率。在这样的背景下,企业网盘作为一种重要的在线存储和协作工具,正在被越来越多的企业所采用。本文将探讨如何利用企业网盘进行文件管理和协作,从而构建高效的团…

Windows快捷键常用介绍,提高工作(摸鱼)效率

一:背景 本文主要是讲解Windows电脑常见的快捷键,包括ctrl快捷键,win快捷键,不管是开发人员还是普通办公人员,都是很方便的。我们平时没事操作都是用鼠标去选择对应的功能,或者在我的电脑--控制面板寻找&a…