【C++初阶(一)】初识C++&命名空间

简介: 【C++初阶(一)】初识C++&命名空间

前言

       今天正式开始C++的学习,C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助。


1. 什么是C++

        C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(面向对象)思想,支持面向对象的程序设计语言应运而生。

       C++是一种通用的、高级的编程语言,它是C语言的扩展和增强版本。C++在C语言的基础上引入了面向对象编程的概念,提供了更多的功能和特性,使得程序员能够更加方便地编写复杂的程序。

2. C++的重要性

  2.1 使用广泛

下图数据来自TIOBE编程语言社区2023年10月最新的排行榜,在30多年的发展中,C/C++几乎一

致稳居前5

注意:排名不能说明哪个语言好,哪个不好,每门编程语言都有适应自己的应用场景。

 2.2 应用领域

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

作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。

3. 命名空间

       我们在日常应用中,一个较大项目一般都是分多文件进行管理,在引用其他文件时就可能会造成命名冲突的问题。例如:

        在stdlib.h中定义了rand函数,我们在包含stdlib.h文件后,再次新建一个命名为rand的变量,运行程序时,编译器分不清要使用的是哪个rand(变量名与库函数冲突),于是就产生了了命名冲突。C语言没办法解决类似这样的命名冲突问题,为了解决上述的问题,C++就提出了命名空间来解决

3.1  什么是命名空间

        命名空间(Namespace)是C++中用来避免命名冲突的一种机制。在C++中,我们可以将一些变量、函数、类等封装在一个命名空间中,从而避免与其他代码中的同名变量、函数、类等发生冲突。

比如:

namespace Q 
{
  int rand = 0;
  int Add(int left, int right)
  {
    return left + right;
  }
  struct Node
  {
    int* data;
    int size;
  };
}

注意:命名空间可以嵌套

这些声明的作用域仅限于该命名空间中。在其他代码中,如果想要使用该命名空间中的变量、函数、类等,需要在前面加上命名空间的名称(默认情况下,程序不会在命名空间里去找)。

3.2 命名空间的使用

  • 使用域作用限定符
int main()
{
  printf("%d\n", Q::rand);//命名空间名::限定变量
  struct Q::Node node;//注意当指定元素时不能指定在struct前边,要在结构体名Node前
    //注意不是struct在空间里边,而是Node在空间里
  Q::Node node1;//或者使用重命名这样写
  return 0;
}
  • 嵌套使用

在一个命名空间里边如果定义两个同名的变量怎么解决?

也很简单,我们可以在嵌套一个。比如:

namespace Q
{
  namespace Q1
  {
    int rand = 666;
  }
  int rand = 0;
}
int main()
{
  printf("%d\n", Q::rand);
  printf("%d\n", Q::Q1::rand);
  return 0;
}
  • 声明和定义分离

在写代码时我们也会经常遇到这种情况

如果声明和变量分离,要把哪个写在命名空间里边?答案是两个都写。

比如:

//fun.h
#pragma once
#include<stdio.h>
namespace Q
{
  typedef struct Stack
  {
    int* data;
    int size;
    int capacity;
  }ST;
  void InitStack(ST* ps);
  void pushStack(ST* ps, int a);
}
//fun.c
#include"Func.h"
namespace Q
{
  void InitStack(ST* ps)
  {
    ps->data = NULL;
    ps->size = 0;
    ps->capacity = 0;
  }
  void pushStack(ST* ps, int a)
  {
    //…
  }
}

它们的命名空间可以同名,在代码编译时编译器会将多个同名的命名空间合并成一个

  • 展开命名空间

有了这个命名空间可以解决命名冲突的问题,但在大量调用命名空间里的内容时就有点麻烦了,比如:

int main()
{
  Q::ST s;
  int a = 0;
  Q::InitStack(&s);
  Q::pushStack(&s, 1);
  Q::pushStack(&s, 2);
  Q::pushStack(&s, 3);
  Q::pushStack(&s, 4);
  Q::pushStack(&s, 5);
}

每次都要加限定符,为了解决这个问题,这时我们可以默认使用这个命名空间(展开命名空间),我们可以加上这行代码:

using namespace Q;

这也是我们在写C++第一个程序:Hello,world!;时为什么要有using namespace std;的原因,std就是C++的官方库定义的命名空间,展开之后就可以随意使用C++库里的函数。

注意:展开命名空间虽然方便,但也不是在任何情况下都可以展开的,在一些大型项目中不要展开std,容易冲突。我们日常写代码练习时,为了方便,可以展开。

  • 展开命名空间里的元素

我们在使用时为了防止展开命名空间引起冲突,又不想一种限定使用怎么办?

这时我们就可以选择展开命名空间里的个别元素,比如:

using std cout;
using std endl;
int main()
{
  cout << "hello,world!";
    //加入换行
    cout << "hello,world!"<< '\n';//或者cout << "hello,world!"<< endl;
}

4.C++输入&输出

        接下来我们来了解一下C++里的输入和输出。

4.1 输出

这是C++入门写的第一个程序,但cout出现了报错,报错显示未声明cout。这是因为我们没有展开std,C++所有库函数都封在std这个库里边,没有展开std库默认就不会从std库里寻找。

int main()
{
  std::cout << "hello,world!";
    //加入换行
    std::cout << "hello,world!"<< '\n';//或者std::cout << "hello,world!"<< std::endl;
}

我们在学习C语言时,输出数据还需要根据数据类型判断使用%d、%lf、%c等,但是C++cout不需要,cout会自动识别数据类型并输出

我们这样限定一下就可以了。

4.2 输入

C++的输入使用的是 “cin” ,cin和cout一样也是可以自动识别数据类型;使用如下:

int main()
{
  int a;
  char c;
  std::cin >> a >> c;
  cout << a << endl << c;
}

4.3 使用说明

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式,C++的输入输出可以自动识别变量类型。

注意:

       早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;        

       旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式。


总结

        C++兼容C,但C++入门基础使用不像C那样简单,其中也存在许多细节上的问题,好了,以上便是本期的全部内容,希望本篇文章可以帮到你。最后,感谢阅读!

相关文章
|
20天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
32 0
|
2月前
|
程序员 C++ 开发者
C++命名空间揭秘:一招解决全局冲突,让你的代码模块化战斗值飙升!
【8月更文挑战第22天】在C++中,命名空间是解决命名冲突的关键机制,它帮助开发者组织代码并提升可维护性。本文通过一个图形库开发案例,展示了如何利用命名空间避免圆形和矩形类间的命名冲突。通过定义和实现这些类,并在主函数中使用命名空间创建对象及调用方法,我们不仅解决了冲突问题,还提高了代码的模块化程度和组织结构。这为实际项目开发提供了宝贵的参考经验。
47 2
|
29天前
|
C语言 C++
C++(六)Namespace 命名空间
命名空间(Namespace)是为了解决大型项目中命名冲突而引入的机制。在多库集成时,不同类库可能包含同名函数或变量,导致冲突。C++通过语法形式定义了全局无名命名空间,并允许对全局函数和变量进行作用域划分。命名空间支持嵌套与合并,便于协同开发。其使用需谨慎处理同名冲突。
|
2月前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
40 4
|
3月前
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
41 1
|
3月前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
3月前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
|
4月前
|
存储 编译器 C++
【C++ 初阶路】--- 类和对象(下)
【C++ 初阶路】--- 类和对象(下)
18 1
|
4月前
|
存储 编译器 C语言
【C++初阶路】--- 类和对象(中)
【C++初阶路】--- 类和对象(中)
25 1
|
4月前
|
安全 编译器 程序员
【C++初阶】--- C++入门(上)
【C++初阶】--- C++入门(上)
27 1