首页 > 知识百科 > 正文

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

文章目录

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


📝C++简述

C语言< /code>同样,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++并不对立的竞争关系:< br /> C++是C语言的加强,是一种更好的C语言。
C++以C语言为基础,并且完全兼容C语言的特性。

C++标准

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

一、是否需要修改代码

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

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

程序不直接访问硬件,不依赖特定的指令集或CPU架构。< /p>

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

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

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

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

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

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

初步的标准ISO/IEC 14882:1998为C++奠定了基础。

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

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

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

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

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

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

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

C++11标准:发布于2011年,是一个重要的标准版本,增加了许多新的语言

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

C++17标准:发布于2017年,主要新增了自定义支持、并行编程支持等新特性。

C++20标准:发布于2023年,主要新增了循环、永恒模板、变量参数模板等功能。
...

🌠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大优点:

< th> 文本件使用途公式< /table>

第一个 C++ 程序

 #包括 使用 命名空间 std;//使用std命名空间int main(int argc , char *argv[]){ void func< /span>() { span> // func定义1 }}命名空间 space2 { void func() { // func定义2  }}

然后其他文件使用时加上空间加大区分,如space1::func()和< code>space2::func()。

使用函数重载

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

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

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

使用类

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

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

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

🌠命名空间

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

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

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

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

🌠命名空间的使用

命名空间的定义

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

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

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

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

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

命名空间 myNamespace { int< /span> myVariable = 0; void myFunction() { //函数实现 }}

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

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

ok来举个例子:

#include //外层命名空间命名空间 externalNamespace { int externalVar = 10; // 洼命名空间 命名空间nestedNamespace { void nestedFunction() { std::cout <<  "嵌套函数内部" << std: :endl; } } // 内联命名空间 inline 命名空间 inlineNamespace { void< /span> inlineFunction() { std::cout << "内部 inlineFunction" << std::endl; } }}//匿名匿名空间namespace  { void anonymousFunction() { std::cout << “匿名函数内部” << std::endl; }}int main() { //访问外层命名空间变量 std:: cout << "outerVar: " << externalNamespace::outerVar < < std::endl; //访问调用调用空间的函数 externalNamespace::nestedNamespace::< span class="ab57-0847-b954-7328 token function">nestedFunction() ; //由于inlineFunction承担联命名空间中,可以直接通过外层命名空间访问 externalNamespace ::inlineFunction(); // 直接访问匿名命名空间中的函数 anonymousFunction(); 返回 0 span>;}

每个答案输出:

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

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

注意

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

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

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

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

1.直接使用限定名

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

#包括 命名空间 MyNamespace { void myFunction() { ::cout<<"void myFunction()"<<std::endl; } int myVariable  = 42;}

使用完全限定名来访问:

int main() {< !-- --> MyNamespace::myFunction(); //调用函数 int value = MyNamespace::myVariable; //访问变量 std< span class="d1f5-ffc8-ec63-2418 token 双冒号标点">::cout<<<<std ::endl; 返回 0;}

输出:

2.使用using声明

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

using MyNamespace ::myFunction;使用 MyNamespace::myVariable;int main() { myFunction() ; //现在可以直接调用函数,消耗衍生空间 int< /span> 值 = myVariable; //直接访问变量 std::cout<<value<<std::endl; 返回 0;}< /span>

3.使用using指令

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

使用 命名空间 MyNamespace;int main() { myFunction() ; //直接调用,外出 int value < span class="b954-7328-c214-8436 token operator">= myVariable; //直接访问 std::cout<<<<std::endl; 返回 0;}

4.抽象命名空间

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

命名空间 外部 { 命名空间 内部 { void innerFunction() { // 函数实现 std::cout<<"void innerFunction()"<<std::endl< span class="ffc8-ec63-2418-ab57 token punctuation">; } } }

在C++17及之后,可以使用唤醒命名空间的简化写入方法:

命名空间 外部::内部 { void innerFunction() { //实现 std::cout<<"void innerFunction()"<<std:: endl; }}

使用完全限定名访问:

int main() {  外部::内部::innerFunction(); //直接调用调用命名空间中的函数 返回 0;} 

输出:

void innerFunction()

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

使用 命名空间 外部::Inner; //引入雕塑命名空间//或者使用外部::内部::innerFunction;int main() {  innerFunction()< /span>; //直接调用 return 0;} 

输出:

void innerFunction< /span>()

使用注意事项

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

命名空间的作用域

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

#包括 使用 命名空间 std;命名空间 A{ int a = 10; int b = 66; int c = 108;}命名空间 B{ int a = 10; int b = 6; int c = 109; }int a = 36;使用 命名空间 A ;使用 命名空间 B;int main(< span class="ec63-2418-ab57-0847 token punctuation">){ //std::cout<  std::cout<<::a<<std::endl;//正确:访问全局的a,::左边空白表示全局域 std::cout<<A::a<<std::endl;//正确:访问A中的a < span class="ab57-0847-b954-7328 token comment">//std::cout< int c = 999; c++;//当前局部的c设置成999,局部信号优先,没有特别的指示优先使用局部域中的元素< /span> std::cout<<c<< std::endl; 返回 0;} 

输出:


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

【C++】C++对C语言的关系,拓展及命名空间的使用原创由知识百科栏目发布,感谢您对的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C++】C++对C语言的关系,拓展及命名空间的使用原创

Copyright © 2012-2023 普诚元亨工作室 版权所有

*本站部分网页素材及相关资源来源互联网,如有侵权请速告知,我们将会在24小时内删除*

Z-BlogPHP 1.7.3 琼ICP备2022020219号

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