【C++】C++对C语言的关系,拓展及命名空间的使用

请添加图片描述

文章目录

  • 📝C++简述
    • C++融合了3种不同的编程方式:
    • C++和C语言关系是啥呢?
    • C++标准
  • 🌠C++应用
  • 🌠C++语言优点
    • 第一个C++程序
  • 🌠命名空间
  • 🌠命名空间的使用
    • 命名空间的定义
  • 🌠怎么使用命名空间中的内容呢?
      • 1. 直接使用完全限定名
      • 2. 使用`using`声明
      • 3. 使用`using`指令
      • 4. 嵌套命名空间
      • 使用注意事项
      • 命名空间的作用域


📝C++简述

C语言一样,C++也是在贝尔实验室诞生的,Bjarne Stroustrup于1979年首次推出,C++是一种高级编程语言,它是在C语言的基础上发展而来,融合了面向对象的思想。它的特点是高效、低级和面向对象。
在C++的发展历程中,最为重要的里程碑是C++11标准的发布。C++11版本增加了许多现代化的特性,例如类型推断、lambdas表达式、移动语义、多线程支持等,大大提高了C++的编程效率和效果。

C++被广泛应用于游戏开发、图形图像处理、嵌入式系统等领域。例如腾讯公司就广泛使用C++来开发游戏引擎、QQ客户端等产品。C++也是Linux内核和Windows系统的主要实现语言。

在编程界,C++已经有40多年的历史,尽管时代不断变迁,但C++依然是系统级和高性能领域的首选语言之一。它在各大编程语言排行榜上长期位居前茅,被众多科技巨头广泛应用。

C++融合了3种不同的编程方式:

  • C语言代表的过程性语言
  • C++在C语言基础上添加的类代表的面向对象语言。
  • C++模板支持的泛型编程。

C++和C语言关系是啥呢?

C++语言是在C语言基础上,添加了面向对象,模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。

注意:C语言C++并不是对立的竞争关系:
C++是C语言的加强,是一种更好的C语言。
C++是以C语言为基础的,并且完全兼容C语言的特性。

C++标准

这里是关于C++程序可移植性的标准:

一、是否需要修改代码

如果一个C++程序满足以下条件,则在重新编译后可以在新平台直接运行,无需修改源代码:

  1. 程序只调用标准C++语言元素和标准库功能,不依赖任何特定平台的库或API

  2. 程序不直接访问硬件,不依赖特定的指令集或CPU架构。

  3. 程序遵循当前ISO标准的C++语言规范和标准库定义。

二、实现可移植性的两个关键点

  1. 硬件依赖性:如果程序直接访问硬件或依赖特定的指令集,则不具有良好的移植性。

  2. 语言实现的一致性:不同平台下编译器对C++标准的实现应保持一致,以确保可移植性。

三、C++标准的制定与发展

  1. ANSI和ISO联合委员会从1990年开始制定统一的C++标准。

  2. 最早的标准ISO/IEC 14882:1998为C++奠定了基础。

  3. 后续标准不断修订和增强语言功能,但保持向下兼容。

  4. 标准库提供跨平台的接口,有助于提高程序的可移植性。

  5. 如果遵循标准,理论上程序可以在任何支持该标准的平台上通过重新编译直接运行。

以上就是关于C++程序可移植性的一些基本标准和原则。如果满足这些条件,则可以实现跨平台良好的可移植性。

如果你想了解C++标准有关版本,可以看看以下:

  • C++98标准:发布于1998年,这是C++语言的第一个正式标准版本。

  • C++03标准:发布于2003年,主要是对C++98标准的一些细微修改和补充。

  • C++11标准:发布于2011年,这是一个重要的标准版本,增加了许多新的语言特性,如auto类型推导、lambda表达式、智能指针等。

  • C++14标准:发布于2014年,基于C++11标准进行了一些增强,如常量表达式、二进制字面量等。

  • C++17标准:发布于2017年,主要新增了模块化支持、 paralle programming支持等新特性。

  • C++20标准:发布于2020年,主要新增了范围for循环、概括模板、可变参数模板等功能。

🌠C++应用

腾讯超级喜欢C++开发? 作为互联网巨头之一的腾讯,一向都是众多游戏公司和科技企业的风向标

腾讯的历史原因 1998年,腾讯成立之初主要开发BBS论坛系统,当时常用的开发语言有PHPASP等脚本语言以及C/C++两种编程语言。由于需要开发游戏等产品,出于性能考虑,腾讯最初选择了C/C++来开发。

随着业务的扩展,腾讯游戏业务迅速发展,需要支持3D图形等游戏引擎,这就决定了必须选择C/C++这种低级语言来开发。从此,C/C++成为腾讯主打的技术方向。

腾讯发展的必然选择 经过20多年的发展,腾讯游戏和IT技术团队已经有数以万计的C/C++开发人员,在游戏引擎和系统开发等领域有着非常深厚的技术积累。

目前腾讯的QQ客户端、微信公众号平台等核心产品都是基于C/C++技术研发的。从游戏引擎、多媒体处理到操作系统开发,C/C++作为系统级语言的优势很明显。因此,C/C++成为腾讯不二选择。

🌠C++语言优点

C++有8大特性,也就是它的8大优点:

⽂件使⽤⽅式含义
跨平台/可移植性跨平台是C++语言的核心优势,在设计之初C++就很注重可移植性和跨平台性,因为C++的运行不依赖任何虚拟机,编译生成的可执行文件可以直接在任何支持该平台的操作系统上运行,省去了大量的代码重复编写时间。
安全性C++提供了面向对象、模板和异常等机制,可以有效避免资源泄漏和错误的访问,使程序更安全可靠。
面向对象C++是完全的面向对象语言,非常适合大型软件的设计和开发。
简单性C++比C语言增加了更多面向对象的特性,如类、继承、重载等,在保留C语言简单易用的同时提高了程序的可维护性。
高性能C++的性能一直处于领先地位,尤其是在游戏、图形和嵌入式系统等领域。
分布式C++支持网络编程和远程调用,可以开发分布式系统。
多线程C++11标准增加了多线程支持,可以方便高效地开发多线程程序。
健壮性C++提供智能指针、异常处理等机制,减少内存泄漏和崩溃的可能性,使程序更健壮可靠。

第一个C++程序

#include <iostream>
using namespace std;//使用std命名空间
int main(int argc , char *argv[])
{int a;a=10;cout <<"a:" <<a<<endl;cout << "Hello, World!" << endl;return 0;
}

在这里插入图片描述
输出:
在这里插入图片描述
注意:
1️⃣、在C语言中,头文件使用扩展名.h,作为一种简单的通过名称标识文件类型的方式。然而,C++的用法有所改变,C++头文件不使用扩展名。有些C语言的头文件被转换为C++头文件,这些文件被重新命名,去掉了.h扩展名(转为C++风格头文件),并在文件名前加上前缀c(表示来自C语言)。例如,C++版本的math.h变为cmathstdio.h变为cstdiostdlib.h变为cstdlib

2️⃣、命名空间是指标识符的各种可见范围。使用关键字namespace来定义命名空间。命名空间是C++的一种机制,用于将具有逻辑关联的大量程序实体组合在一起,这些实体共享相同的标识符。std是命名空间(名字空间)的名称,命名空间的主要作用是解决日益严重的名称冲突问题。随着可重用代码的增加,不同代码库中同名标识符之间的冲突会显著增加。解决方法是将不同的代码库放置在不同的命名空间中。
思考:如果在项目中需要定义两个名为func的函数,并且这两个函数都可以被其他文件访问,应该怎么办?

答:如果在同一个项目中需要定义两个同名函数func,而这两个函数都需要被其他文件访问,可以采取以下方法:

  1. 使用命名空间

可以把两个func函数放入不同的命名空间中,比如:

namespace space1 
{void func() {// func定义1}
}namespace space2 
{void func() {// func定义2 }
}

然后其他文件使用时加上命名空间前缀区分,如space1::func()space2::func()

  1. 使用函数重载

可以给两个func函数添加不同的参数列表进行函数重载:

void func() 
{// func定义1
}void func(int x) 
{// func定义2
}
  1. 将函数定义放在不同的头文件中

比如func1.hfunc2.h,然后分别#include相应的头文件。

  1. 使用类

可以将两个func函数定义在不同的类中:

class A 
{
public:void func() {/*func1定义*/} 
};class B 
{
public:void func() {/*func2定义*/}
};

总之,通过命名空间,函数重载,不同头文件以及类等机制可以很好地区分开两个同名函数。
3️⃣、coutC++中的标准输出流,endl用于输出换行并刷新缓冲区。

🌠命名空间

C++命名空间的基本概念:

  1. 在大型项目开发中,会涉及大量名称(如常量、变量、函数、类等),名称管理是程序设计的基本活动之一。C++通过命名空间的机制,可以控制名称的产生和访问范围。

  2. C++中所有名称,如符号常量、变量、宏、函数、结构、枚举、类以及对象等都是可以定义在命名空间中的。

  3. std命名空间是C++标准命名空间。C++标准库中的所有标识符如iostream类和vector类都是定义在这个std命名空间中的。如果需要使用这些标准库中的功能,需要添加using声明或使用std前缀来限定名称,比如使用std::cout输出。

🌠命名空间的使用

命名空间的定义

C++中的命名空间是一种封装标识符(如变量名、函数名、类名等)的方式,用于防止命名冲突。命名空间允许组织代码以避免可能出现的标识符冲突,尤其是在大型项目或者在使用多个库时。它可以被视为一种定义标识符的作用域,这些标识符在该命名空间内是可见的,而在命名空间外则不是。

定义命名空间的基本语法如下:

namespace 名称 {// 定义变量、函数、类等
}

这里,名称是你给命名空间指定的名字,可以根据需要在里面定义变量、函数、类等。

例如,定义一个名为myNamespace的命名空间,并在其中定义一个函数和一个变量:

namespace myNamespace 
{int myVariable = 0;void myFunction() {// 函数实现}
}

使用命名空间内的成员时,需要使用命名空间的名称和作用域解析运算符::来指定,如myNamespace::myVariablemyNamespace::myFunction()

命名空间可以嵌套定义,即一个命名空间内可以定义另一个命名空间。此外,C++还支持匿名命名空间和内联命名空间的概念。匿名命名空间是在文件内部提供了一个独一无二的命名空间,而内联命名空间则允许在外层命名空间直接访问内联命名空间中的成员,无需通过作用域解析运算符。

ok来举个例子:

#include <iostream>// 外层命名空间
namespace outerNamespace {int outerVar = 10;// 嵌套命名空间namespace nestedNamespace {void nestedFunction() {std::cout << "Inside nestedFunction" << std::endl;}}// 内联命名空间inline namespace inlineNamespace {void inlineFunction() {std::cout << "Inside inlineFunction" << std::endl;}}
}// 匿名命名空间
namespace {void anonymousFunction() {std::cout << "Inside anonymousFunction" << std::endl;}
}int main() {// 访问外层命名空间变量std::cout << "outerVar: " << outerNamespace::outerVar << std::endl;// 访问嵌套命名空间的函数outerNamespace::nestedNamespace::nestedFunction();// 由于inlineFunction在内联命名空间中,可以直接通过外层命名空间访问outerNamespace::inlineFunction();// 直接访问匿名命名空间中的函数anonymousFunction();return 0;
}

每个对应输出:
在这里插入图片描述

解析:在这个例子中,我们定义了一个外层命名空间outerNamespace,它包含一个变量outerVar、一个嵌套命名空间nestedNamespace和一个内联命名空间inlineNamespacenestedNamespace内定义了一个函数nestedFunction(),而inlineNamespace内定义了一个函数inlineFunction()。因为inlineFunction()在内联命名空间中,它可以被当作是直接在outerNamespace中定义的,所以我们可以不通过内联命名空间的名称直接访问它。

此外,我们还定义了一个匿名命名空间,并在其中定义了函数anonymousFunction()。由于匿名命名空间的特性,该函数只在定义它的文件内部可见,从而提供了一种限制访问范围的方法。

注意

  • 命名空间的名字可以重复,这种重复并非两个不同的命名空间,而是在编译过程中将相同名字的命名空间合并,事实上还是一个命名空间
  • 命名空间不能在类和函数中定义

C++的using指令或using声明可以用来简化命名空间成员的访问,但过度使用可能会引起名称冲突的问题。

🌠怎么使用命名空间中的内容呢?

在C++中,使用命名空间中的内容主要有以下几种方式:

1. 直接使用完全限定名

这是最直接的方式,通过命名空间的名称和作用域解析运算符::来访问命名空间中的变量、函数或类型。例如:

#include <iostream>
namespace MyNamespace {void myFunction() {// 函数实现std::cout<<"void myFunction()"<<std::endl;}int myVariable = 42;
}

使用完全限定名来访问:

int main() 
{MyNamespace::myFunction(); // 调用函数int value = MyNamespace::myVariable; // 访问变量std::cout<<value<<std::endl;return 0;
}

输出:
在这里插入图片描述

2. 使用using声明

你可以使用using声明来引入命名空间中特定的名称,从而在当前作用域中直接使用这个名称,而不需要每次都提供完整的命名空间前缀。例如:

using MyNamespace::myFunction;
using MyNamespace::myVariable;int main() {myFunction(); // 现在可以直接调用函数,无需命名空间前缀int value = myVariable; // 直接访问变量std::cout<<value<<std::endl;return 0;
}

3. 使用using指令

使用using指令可以将命名空间中的所有名称引入当前作用域,这样你就可以直接使用这些名称而不需要命名空间前缀。但这种方法可能会导致名称冲突,特别是当引入多个命名空间中有相同名称的成员时。例如:

using namespace MyNamespace;int main() 
{myFunction(); // 直接调用,无需前缀int value = myVariable; // 直接访问std::cout<<value<<std::endl;return 0;
}

4. 嵌套命名空间

考虑有如下嵌套命名空间Outer::Inner,并在内部定义了innerFunction:

namespace Outer 
{namespace Inner {void innerFunction() {// 函数实现std::cout<<"void innerFunction()"<<std::endl;}}
}

在C++17及之后,可以使用嵌套命名空间的简化写法:

namespace Outer::Inner 
{void innerFunction() {// 实现std::cout<<"void innerFunction()"<<std::endl;}
}

使用完全限定名访问:

int main() {Outer::Inner::innerFunction(); // 直接调用嵌套命名空间中的函数return 0;
}

输出:

void innerFunction()

或者使用using指令或声明简化访问:

using namespace Outer::Inner; // 引入嵌套命名空间
// 或者
using Outer::Inner::innerFunction;int main() {innerFunction(); // 直接调用return 0;
}

输出:

void innerFunction()

使用注意事项

  • 精确性:直接使用完全限定名是最精确的方式,可以避免任何潜在的命名冲突。
  • 简洁性与清晰性using声明和using指令可以使代码更简洁,但过度使用可能会降低代码的清晰性和可维护性,特别是在大型项目或者使用多个库时。
  • 作用域考虑:使用using声明和using指令时,应该考虑到它们的作用域。通常,将它们放在函数内部或者局部作用域内可以减少潜在的命名冲突和其他问题。

命名空间的作用域

使用using namespace命名空间名称引入,可以将命名空间中的所有成员引入到当前作用域中,可以直接使用命名空间中的成员,而不需要使用命名空间前缀。

#include <iostream>
using namespace std;
namespace A
{int a = 10;int b = 66;int c = 108;
}
namespace B
{int a = 10;int b = 6;int c = 109;
}
int a = 36;using namespace A;
using namespace B;int main()
{//std::cout<<a<<std::endl;//这种写法是错误的,因为全局中定义了a,命名空间tmh中的a也展开在了全局域std::cout<<::a<<std::endl;//正确:访问全局的a,::左边空白表示全局域std::cout<<A::a<<std::endl;//正确:访问A中的a//std::cout<<b<<std::endl;//错误,应严格写出哪个命名空间的bint c = 999;c++;//当前局部的c设置成999,局部变量优先,没有特别的指示优先使用局部域中的元素std::cout<<c<<std::endl;return 0;
}

输出:
在这里插入图片描述


感谢你的收看,如果文章有错误,可以指出,我不胜感激,让我们一起学习交流,如果文章可以给你一个小小帮助,可以给博主点一个小小的赞😘

请添加图片描述

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

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

相关文章

测试C#使用ViewFaceCore实现图片中的人脸遮挡

基于ViewFaceCore和DlibDotNet都能实现人脸识别&#xff0c;准备做个遮挡图片中人脸的程序&#xff0c;由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系&#xff0c;最终决定使用ViewFaceCore实现图片中的人脸遮挡。   新建Winform项目&#xff0c;在Nuget包管理器中…

【深度学习】微调ChatGlm3-6b

1.前言 指令微调ChatGlm3-6b。微调教程在github地址中给出&#xff0c;微调环境是Qwen提供的docker镜像为环境。 镜像获取方式&#xff1a;docker pull qwenllm/qwen:cu117 github地址&#xff1a;https://github.com/liucongg/ChatGLM-Finetuning 2.微调过程 github地址中的教…

Excel工作表控件实现滚动按钮效果

实例需求&#xff1a;工作表中有多个Button控件&#xff08;工作表Form控件&#xff09;和一个ScrollBar控件&#xff08;工作表ActiveX控件&#xff0c;名称为ScrollBar2&#xff09;&#xff0c;需要实现如下图所示效果。点击ScrollBar控件实现按钮的滚动效果&#xff0c;实际…

2024.2.25 在centos8.0安装docker

2024.2.25 在centos8.0安装docker 安装过程比较简单&#xff0c;按顺序安装即可&#xff0c;简要步骤&#xff1a; 一、更新已安装的软件包&#xff1a; sudo yum update二、安装所需的软件包&#xff0c;允许 yum 通过 HTTPS 使用存储库&#xff1a; sudo yum install -y …

飞天使-k8s知识点22-kubernetes实操7-ingress

文章目录 ingress环境准备准备service和pod验证效果 https 代理效果 ingress 在 Kubernetes 中&#xff0c;Ingress 是一种 API 对象&#xff0c;它管理外部访问集群内部服务的规则。你可以将其视为一个入口&#xff0c;它可以将来自集群外部的 HTTP 和 HTTPS 路由到集群内部的…

静态时序分析:SDC约束命令set_load详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_load命令用于指定端口(port)或线网(net)的负载电容&#xff0c;该指令的BNF范式&#xff08;有关BNF范式&#xff0c;可以参考以往文章&#xff09;为&#…

Java核心-核心类与API(4)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;最后介绍一下Object类以及与数学、日期/时间有关的类&#xff0c;就结束该部分的学习了&#xff0c;其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类…

linux-并发通信

一.linux-tcp通信框架 1.基础框架 1.1 tcp 服务器框架 1.套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol);
 返回的文件描述符可以指向当前的socket&#xff0c;后续通过对文件描述符的访问就可以配置这个socket 成功时返回文件…

nccl2安装指南

https://developer.nvidia.com/nccl/nccl-download 旧版本安装: https://developer.nvidia.com/nccl/nccl-legacy-downloads 找到你对应的CUDA版本 我这里选择 deb 文件安装了 sudo dpkg -i nccl-local-repo-ubuntu2004-2.16.5-cuda11.8_1.0-1_amd64.debsudo cp /var/nccl-lo…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

政安晨:【机器学习基础】(二)—— 评估机器学习模型改进

根据前面我的文章看来&#xff0c;咱们只能控制可以观察到的东西。因为您的目标是开发出能够成功泛化到新数据的模型&#xff0c;所以能够可靠地衡量模型泛化能力是至关重要的&#xff0c;咱们这篇文章将正式介绍评估机器学习模型的各种方法。 政安晨的个人主页&#xff1a;政安…

Hikvision SPON IP网络对讲广播系统命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1.漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视&a…

低功耗设计——门控时钟

1. 前言 芯片功耗组成中&#xff0c;有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟buffer&#xff0c;而且为了最小化时钟延时&#xff0c;它们通常具有很高的驱动强度。此外&…

leetcode hot100 买卖股票最佳时机3

本题中&#xff0c;依旧可以采用动态规划来进行解决&#xff0c;之前的两个题我们都是用二维数组dp[i][2]来表示的&#xff0c;其中i表示第i天&#xff0c;2表示长度为2&#xff0c;其中0表示不持有&#xff0c;1表示持有。 本题中&#xff0c;说至多完成两笔交易&#xff0c;也…

力扣--动态规划1027.最长等差数列

思路分析&#xff1a; 使用动态规划的思想&#xff0c;定义二维数组dp&#xff0c;其中dp[i][j]表示以nums[i]为结尾&#xff0c;公差为(j-1000)的等差数列长度。为了适应负数的情况&#xff0c;将公差的范围设为[-1000, 1000]&#xff0c;并且加上1000作为数组索引。 初始化r…

11:日志分析系统ELK|Elasticsearch|kibana

日志分析系统ELK&#xff5c;Elasticsearch&#xff5c;kibana 日志分析系统ELKELK概述Elasticsearch安装Elasticsearch部署Elasticsearch集群Elasticsearch插件 熟悉Elasticsearch的API调用_cat API创建 tedu 索引使用 PUT 方式增加数据查询数据修改数据删除数据 KibanaKibana…

锂电池SOC估计 | PyTorch实现基于Basisformer模型的锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 PyTorch实现基于Basisformer模型的锂电池SOC估计 锂电池SOC估计&#xff0c;全新【Basisformer】时间序列预测 1.采用自适应监督自监督对比学习方法学习时序特征&#xff1b; 2.通过双向交叉注意力机制计算历史序列和…

BL、万科、中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉、中国建筑校招笔试题

为了帮助应聘者更好地备战地产公司的招聘考试&#xff0c;我将介绍以下13套校招试题资料&#xff0c;涵盖了24 BL、24万科、24中海地产、碧桂园、华润置地、佳兆业、金地商置、龙湖、绿城、融创、时代中国、旭辉和中国建筑等知名房地产企业&#xff0c;为您提供全方位的备考资源…

提高移动应用的安全性:策略与实践

提高移动应用的安全性&#xff1a;策略与实践 随着移动应用的普及&#xff0c;安全性问题变得日益重要。用户数据保护、应用逻辑安全、以及防止恶意攻击都是开发者必须关注的重点。本文将探讨如何通过一系列策略和实践来提高移动应用的安全性。 1. 数据加密与保护 敏感数据加…

2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)

【EI检索】2024年环境安全科学、材料工程与制造国际学术会议&#xff08;ESSMEM2024) 会议简介 我们很高兴邀请您参加将在三亚举行的2024年环境安全科学、材料工程和制造国际学术会议&#xff08;ESSMEM 2024&#xff09;。 ESSMEM2024将汇集世界各国和地区的研究人员&…