【C++初阶(一)】学习前言 命名空间与IO流

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

什么是C++

C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

C++发展史

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

我们先来看下C++的历史版本:

现在公司主流使用还是C++98和C++11。

关于C++2X最新特性的讨论:

https://zhuanlan.zhihu.com/p/107360459

C++现状:

C/C++在TIOBE编程语言社区

常年位居前五

在23年更是霸榜前三!

C++在工作领域中的应用

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

C++入门部分

C++关键字:

C++总计63个关键字,C语言32个关键字。

命名空间:

在介绍命名空间之前,先看下面代码所示:

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

这个代码很简单,实现的功能就是打印rand函数的值。(这里赋值为10.并且以全局变量定义)

那我们在这个代码实现的基础上加一个头文件:

#include<stdlib.h>

也就是说:

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

我们看一下在编译器中运行的结果:

加了个头文件后,编译器报错了,这是为什么呢?

我们看报错原因:说是rand函数重定义。这是因为在库中已经有了rand这个函数,如果再次使用rand这个名字定义变量或者函数时,编译器会分不清你到底想使用哪个rand,因而报错。

那么如何解决这个问题呢?

这就是我们要首先介绍的命名空间

C++为了解决C语言上述的问题

引出了命名空间这种玩法

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

命名空间定义:

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

//NIC是命名空间的名字,一般开发中是用项目名字做命名空间名。
namespace NIC
{
  // 命名空间中可以定义变量/函数/类型
  int rand = 10;//变量
  int Add(int left, int right)//函数
  {
    return left + right;
  }
  struct Test//结构体
  {
    int a[10];
    int val;
  };
}

命名空间相当于一个独立的作用域
命名空间中所有内容都局限于该命名空间中

当然,命名空间也可以嵌套:

namespace NIC
{
  // 命名空间中可以定义变量/函数/类型
  int rand = 10;//变量
  int Add(int left, int right)//函数
  {
    return left + right;
  }
  struct Test//结构体
  {
    int a[10];
    int val;
  };
  //命名空间的嵌套:
  namespace NIC2
  {
    int a;
    int b;
    int sum(int x, int y)
    {
      return x + y;
    }
    struct Student
    {
      int ID;
      char Name[20];
    };
  }
}

命名空间的使用:

那么我们回到我们最初的那个问题,既然我们现在知道了是函数冲突产生的问题,并且用命名空间解决,那么如何使用呢?

先看下面代码示例:

int main()
{
  printf("%d", NIC::rand);
  return 0;
}

我们刚才把rand函数包装在了我们的命名空间里,这里我们要打印rand的值,采用了命名空间名+::的形式,这就是使用命名空间的第一种方法:加命名空间名称及作用域限定符。

方法一:加命名空间名称及作用域限定符(不展开命名空间)

:: 域作用限定符。

通过域作用符我们就可以访问命名空间中的成员:

int main()
{
  printf("%d\n", NIC::rand);
  int b = NIC::Add(1, 3);
  printf("%d", b);
  struct NIC::Test node;
  return 0;
}

结果显示:

这个代码示例我们访问了我们命名空间里面的rand和Add函数。最后一个我们开辟了结构体的新节点。

方法二:使用using将命名空间中某个成员引入(展开空间中部分内容)

假设NIC空间中的rand使用频率很高

可以将rand变量单独展开到全局域

using NIC::rand;

假设NIC空间中的Add函数使用频率很高

可以将Add函数单独展开到全局域

using NIC::Add;

看一下测试代码:

using  NIC::rand;
int main()
{
  int b = rand;//rand展开直接用
  int c = NIC::Add(3, 5);//Add没有展开,需要用域作用符::访问
  printf("%d\n%d", b, c);
  return 0;
}

结果如下:

方法三:使用using namespace 命名空间名称 引入(展开空间中全部内容)

在空间NIC后面加上

using namespace NEO;

这句话的意思是:

将空间NIC展开为全局域

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

using namespace std;

std就是C++的标准库。

当NIC空间被展开后

空间里的所有内容可以直接使用:

namespace NIC
{
  // 命名空间中可以定义变量/函数/类型
  int rand = 10;//变量
  int Add(int left, int right)//函数
  {
    return left + right;
  }
  struct Test//结构体
  {
    int a[10];
    int val;
  };
  //命名空间的嵌套:
  namespace NIC2
  {
    int a;
    int b;
     int sum(int x, int y)
     {
     return x + y;
     }
     struct Student
       {
      int ID;
      char Name[20];
      };
  }
}
using namespace NIC;
int main()
{
  int b = rand;
  printf("%d", b);
  return 0;
}

结果如下:

对命名空间展开的思考

假设我们将自定义NIC空间和标准库的std空间同时展开

那么整型变量rand和rand函数同时暴露在全局域

我们再去使用它时也会报错:

using namespace std;
using namespace NIC;

所以直接展开std标准库也有冲突风险

但是不展开的话,写输入输出会很麻烦

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

结论:

1.写项目时,尽量不要展开标准库

2.日常练习时应该展开标准库

3.写项目使用部分常用内容展开

C++输入与输出:

C语言输入输出方式,相信大家都并不陌生,那么C++如何输入输出呢?

在C++中,输入输出用的是IO流,跟C语言一样,在使用C++输入输出前要包含一个头文件:

#include<iostream>

其次,因为输入输出函数直接在库里面,我们可以直接展开std库也可以访问std库。

using namespace std;
using std::cout
using std::cin
using std::endl

具体用什么方式应人而异,根据自己习惯选择。

cout(标准输出对象(控制台))

C++中用:cout<< 来进行打印输出。(console:控制台 out:输出)

<<:流插入运算符

using std::cout;
int main()
{
  cout << "hello world\n";
  return 0;
}

输出结果:

从代码示例,我们可以理解为:hello word字符串就是流,流向到对象(终端)中去,进行打印输出。

补充1:

在C语言中,根据类型不同,我们用printf函数打印的时候,需要指定格式才能打印:

int main()
{
  int a = 10;
  double b = 5.5;
  printf("%d %.2lf", a, b);
  return 0;
}

但是我们C++中,会自动识别类型:

using std::cout;
int main()
{
  cout << "hello world\n";
  int a = 10;
  double b = 5.5;
  cout << a<<"\n";
  cout << b;
  return 0;
}

输出结果:

不仅如此:打印的时候我们可以多次用<<流插入运算符。

using std::cout;
int main()
{
  cout << "hello world\n";
  int a = 10;
  double b = 5.5;
  cout << a<<"\n"<<b<<"\n"<<"hello world\n"<<'\n';
  return 0;
}

输出结果:

补充2:

在C++中,我们可以用endl来表示换行符。(end:结尾 Line:行)

int main()
{
  // IO流
  // 自动识别输出变量的类型
  // <<流插入
  std::cout << "hello world\n";
  int a = 10;
  double b = 11.11;
  //std::cout << a << "\n";
  //std::cout << b << "\n";
  std::cout << a << "\n" << b << '\n';
  std::cout << a << std::endl << b << std::endl;
  return 0;
}

输出结果:

cin(标准输入对象(键盘))

C++中用:cin>>来进行获取键盘输入。(console:控制台 in:里面)

<<:流提取运算符

using  std::cin;
using  std::cout;
using  std::endl;
int main()
{
  int a;
  double b;
  // 流提取
  cin >> a >> b;
  cout << a  << endl << b << endl;
  cout << a << endl << b << endl;
  return 0;
}

输出结果:

注意:关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出进制格式等等。因为C++兼容C语言的用法,这些又用得不是很多,我们这里就不展开学习了。后续如果有需要,我
们可以进行网上查阅并仔细学习。

相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
90 0
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
85 1
Linux C/C++之IO多路复用(aio)
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
81 0
|
27天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
24 0
Linux C/C++之IO多路复用(poll,epoll)
|
1月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
21 1
|
3月前
|
算法 C语言 C++
【C++航海王:追寻罗杰的编程之路】C++的IO流
【C++航海王:追寻罗杰的编程之路】C++的IO流
33 2
|
4月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
25 5
|
11天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
40 4
下一篇
无影云桌面