【C++初阶(一)】学习前言以及命名空间

简介: 【C++初阶(一)】学习前言以及命名空间

💓博主CSDN主页:杭电码农-NEO💓


⏩专栏分类:C++初阶之路


🚚代码仓库:NEO的学习日记🚚


🌹关注我🫵带你学习排序知识

  🔝🔝


1. 前言

对于复杂的问题,规模较大的程序
需要高度的抽象和建模时
C语言不再适合应用于这种场景
于是在1982年
C++创始人 Bjarne Stroustrup

在C语言基础上引入面向对象编程概念

本节内容将在介绍完C++个方面的内容后
讲解C++入门第一课:命名空间的内容


2. C++发展历史

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C
语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with
classes。

阶段 内容
C with classes 类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符
C++1.0 添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0 更加完善支持面向对象,新增保护成员、多重继承、对象的初始化等等
C++3.0 进一步完善引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98 C++标准第一个版本,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03 C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05 C++标准委员会发布了一份计数报告,正式更名C++0x
C++11 增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等
C++14 对C++11的扩展,主要是修复C++11中漏洞以及改进,比如:泛型的lambda表达式,auto的返回值类型推导,二进制字面常量等
C++17 在C++11上做了一些小幅改进,增加了19个新特性,比如:static_assert()的文本信息可选,Fold表达式用于可变的模板,if和switch语句中的初始化器等
C++20 自C++11以来最大的发行版,引入了许多新的特性,比如:模块(Modules)、协程(Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有特性的更新:比如Lambda支持模板、范围for支持初始化等
C++23 正在制定中

3. C++现状

C/C++在TIOBE编程语言社区
常年位居前五

在23年更是霸榜前三!

关于C++23和最新的C++26
最前沿的改动文章给大家分享两篇

C++23前沿
C++26前沿


实际生活中
C++运用的地方非常多
比较典型的有:

  1. 操作系统以及大型系统软件开发
  2. 服务器端开发
  3. 游戏开发
  4. 嵌入式和物联网领域
  5. 数字图像处理
  6. 人工智能的算法核心领域

在校招笔试面试中
C++更是重量级的存在


4. C语言命名冲突

我们在写C语言时,会遇见这种问题:

取变量名时可能会和库中得变量名冲突

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

此时运行程序会报错:

这是因为在库中有了rand这个函数,再次使用rand这个名字定义变量或者函数时,编译器会分不清你到底想使用哪个rand


5. 命名空间

C++为了解决C语言上述的问题
引出了命名空间这种玩法

(C++兼容C语言的所有语法)

定义命名空间,需要使用到namespace关键字
后面跟命名空间的名字,然后接一对{}
{}中即为命名空间的成员

比如:

namespace NEO
{
  // 命名空间中可以定义变量/函数/结构体
  int rand = 10;
  int Add(int left, int right)//函数
  {
    return left + right;
  }
    struct Test//结构体
  {
    int a[10];
    int val;
  };
}

命名空间相当于一个独立的作用域

命名空间中所有内容都局限于该命名空间中

(注:命名空间可以嵌套定义)

拓展:

一个项目或者源文件可以有多个命名空间
它们的名字可以相同

相同名字的空间将会合并为一个空间


6. 命名空间的使用

6.1 方法一

方法一:不展开命名空间时

使用 :: 操作符

namespace NEO
{
  // 命名空间中可以定义变量/函数/结构体
  int rand = 10;
  int Add(int left, int right)
  {
    return left + right;
  }
    struct Node
  {
    struct Node* next;
    int val;
  };
}
int main()
{
  int a = NEO::rand;
  int x = NEO::Add(10,20);
  printf("%d", NEO::rand);
  return 0;
}

在命名空间NEO里面
你如果想使用一个变量或者函数
应该在这之前加上:

空间名 ::


6.2 方法二

方法二:展开命名空间

在空间NEO后面加上

using namespace NEO;

这句话的意思是:
将空间NEO展开为全局域

我们在看C++程序时经常看见:

using namespace std;

std就是C++的标准库

已知C++的输出函数是cout
cout是在标准库中定义的
假设标准库没有展开
我们使用cout时,编译器在全局域
没有找到cout就会报错.
这时就应该这样写:

std::cout << "hello world" << ;

当NEO空间被展开后
空间里的所有内容可以直接使用:

#include<stdio.h>
namespace NEO
{
  // 命名空间中可以定义变量/函数/结构体
  int rand = 10;
  int Add(int left, int right)
  {
    return left + right;
  }
    struct Node
  {
    struct Node* next;
    int val;
  };
}
using namespace NEO;
int main()
{
  int a = rand;
  printf("%d", rand);
  return 0;
}

6.3 方法三

方法三:展开空间中部分内容

假设NEO空间中的rand使用频率很高
可以将rand变量单独展开到全局域

using NEO::rand;

若Add函数使用频率很高:

using NEO::Add;

using NEO::rand;
int main()
{
  int a = rand;//rand展开了直接用
  int x = NEO::Add(10,20);//Add函数没有展开,要使用 ::
  printf("%d", rand);
  return 0;
}

7. 对命名空间展开的思考

假设我们将自定义NEO空间和
标准库的std空间同时展开
那么整型变量rand和rand函数
同时暴露在全局域
我们再去使用它时也会报错

using namespace std;
using namespace NEO;

所以直接展开std标准库也有冲突风险
但是不展开的话,写输入输出会很麻烦

那么平时写代码时应该怎么办?

结论:

  • 写项目时,尽量不要展开标准库
  • 日常练习时应该展开标准库
  • 写项目使用部分常用内容展开

8. 总结以及拓展

命名空间的存在奠基了C++
能作为创建一个大工程的语言
大工程往往会分组安排任务
每个小组可以使用不同的命名空间
每个空间定义相同的名字也没事
这对于开发者来说十分方便!

拓展:

分享几个用C++开发的知名游戏:

  • 绝地求生
  • 巫师三
  • 黑暗之魂
  • 无主之地2
  • 生化危机5


相关文章
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
86 0
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
24 1
|
2月前
|
安全 程序员 编译器
【C++】如何巧妙运用C++命名空间:初学者必备指南
【C++】如何巧妙运用C++命名空间:初学者必备指南
|
4月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
66 2
|
3月前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
46 0
|
4月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
49 4
|
3月前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
5月前
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
49 1
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)