【C++入门基础(上)】(一)

简介: 【C++入门基础(上)】(一)

Cross the stars over the moon to meet your better-self.

7f02f2e752d84ed6818959bcfdfee20b.jpg

1 命名空间

在 C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是 对标识符的名称进行本地化 ,以 避免命名冲突或名字 污染 , namespace 关键字的出现就是针对这种问题的。

1.1 命名空间定义

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

我们可以来举一些例子:

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

为啥这段代码会报错呢?


a848f5fa58f74555a418fac433f830db.png

经过分析我们不难发现我们自己定义的rand与官方库里定义的rand函数冲突了,解决方法就是用命名空间来隔离我们所定义的变量或者函数:

namespace grm
{
  int rand = 1;
}

我们发现这样就可以编译通过了。

注意:

1 命名空间中的内容,既可以定义变量,也可以定义函数;

2 命名空间可以嵌套 ;

3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

像下面这两种方式都是合理的:

// 命名空间可以嵌套
namespace grm
{
  int a;
  int b;
  int Add(int left, int right)
  {
    return left + right;
  }
  namespace N3
  {
    int c;
    int d;
    int Sub(int left, int right)
    {
      return left - right;
    }
  }
}

而且最后编译器会将同一个工程中相同的命名空间合并为一个命名空间。但是值得注意的是一旦命名空间中变量定义了就不可以在命名空间中修改:

1de82021300f427d88cac986dec3ae7a.png

这样都会导致编译器报错的。

一个命名空间就定义了一个新的作用域 ,命名空间中的所有内容都局限于该命名空间中。这句话的意思简单点来说就是我们自己定义的命名空间就是一个隔离区,不会与库里面的变量或者函数发生冲突,那么应该如何使用命名空间呢?

1.2 命名空间使用

1.2.1 加命名空间名称及作用域限定符

什么是作用域限定符呀?

::   (两个冒号)

namespace grm
{
  int rand = 1;
  int ret = 1001;
  int Add(int x, int y)
  {
    return x + y;
  }
}
int main()
{
  printf("%d\n", grm::rand);
  printf("%d\n", grm::ret);
  printf("%d\n", grm::Add(10,20));
  return 0;
}

7b65508904ff46648c8a136e2d27f69c.png

1.2.2 使用using将命名空间中成员引入

#include<stdio.h>
//#include<stdlib.h>
namespace grm
{
  int rand = 1;
  int ret = 1001;
  int Add(int x, int y)
  {
    return x + y;
  }
}
using grm::rand;
using grm::Add;
int main()
{
  printf("%d\n", rand);
  printf("%d\n", grm::ret);
  printf("%d\n", Add(10,20));
  return 0;
}

这个时候记得把库里面的rand给屏蔽了,不然就会冲突。


074d9a1274b94488883075fb64b16362.png

1.2.3 使用using namespace 命名空间名称引入

这种方式最为简单,但是不推荐在工程里面用,否则可能会发生命名冲突的问题,平常的代码练习可以这样做(因为代码量不会太大,一般不会冲突)

using namespace grm;
int main()
{
  printf("%d\n", rand);
  printf("%d\n", ret);
  printf("%d\n", Add(10,20));
  return 0;
}

2 C++输入&&输出

#include<iostream>
int main()
{
  int i;
  char c;
  double d;
  std::cin >> i >> c >> d;
  std::cout << i << " " << c << " " << d << std::endl;
  return 0;
}

说明:

1. 使用 cout 标准输出 ( 控制台 ) 和 cin 标准输入 ( 键盘 ) 时,必须 包含 < iostream > 头文件 以及 std 标准命名空间。

注意:早期标准库将所有功能在全局域中实现,声明在 .h 后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在 std 命名空间下,为了和 C 头文件区分,也为了正确使用命名空间,规定 C++ 头文 件不带 .h ;旧编译器 (vc 6.0) 中还支持  格式,后续编译器已不支持,因此 推荐 使用 +std 的方式。

2. 使用 C++ 输入输出更方便,不需增加数据格式控制,比如:整形 --%d ,字符 --%c

3 其中<< 表示流插入符   >>表示流提取符。

4 endl表示换行。

但是上面老是用std::很麻烦,平常练习中我们为了轻松一点儿可以直接用

using namespace std 直接将库中所有的函数和变量都引出来,但是在工程中并不推荐这样做。

#include<iostream>
using namespace std;
int main()
{
  int i;
  char c;
  double d;
  cin >> i >> c >> d;
  cout << i << " " << c << " " << d << endl;
  return 0;
}

我们发现了用cin && cout居然不用管变量的类型是啥,不像C语言还得记住整形用%d 字符用%c 等等。但是万事也不是绝对,有时用scanf && printf比用cin && cout要简单些,具体情况具体分析,一般来说,哪种方便用哪个,甚至还可以组合使用。


目录
相关文章
|
5月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
68 0
|
9月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
8月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
142 2
C++入门12——详解多态1
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
194 1
|
存储 C++ 容器
C++入门9——list的使用
C++入门9——list的使用
139 1
|
C语言 C++ 容器
C++入门7——string类的使用-1
C++入门7——string类的使用-1
99 0
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
232 1
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
199 0
C++入门6——模板(泛型编程、函数模板、类模板)