【初识C++】(关键字,命名空间)

简介: 一、C++中的关键字二、命名空间命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。比如:一、C++中的关键字

一、C++中的关键字

aaf75e44b8504b2b859d4bf04b49a9b8.png

二、命名空间

命名空间是对于全局变量来说,我们在定义变量或函数时,函数名可能会和库中的函数名产生冲突。

比如:


6dec9a88f53c449ca6ef548319fa847d.png

报错的意思是:库中存在rand这个函数,而我又定义一个rand这个变量,所以会产生名字的冲突。

为了解决这个问题,C++引入了命名空间这个概念。

而与该命名空间的关键字是:namespace

1.命名空间规则

命名空间搜索规则:局部域->全局域->命名空间域(如果不指定,不会主动去搜索)

首先引入域的概念,学习c语言会知道,有一个域叫做作用域,比如局部作用域和全局作用域。

来看下面的代码:

int a = 10;
int main()
{
  int a = 0;
  return 0;
}

我分别要输出局部作用域的a和全局作用域的a该如何输出?

使用域作用限定符

域作用限定符是: “域名+::” ,两个冒号。

比如这样:

int a = 10;
int main()
{
  int a = 0;
  printf("%d\n", a);
  printf("%d\n", ::a);
  return 0;
}

对于全局作用域来说,想要获取a,直接在a前面加上两个冒号即可,全局域的域名可以省略。

访问命名空间域的方法:

1.展开命名空间域

看下面的代码:

namespace dzt
{
  int a = 5;
}
//int a = 10;
int main()
{
  //int a = 0;
  printf("%d\n", a);
  return 0;
}

这样的代码,假如要输出a,是不行的,编译器报的错误是:

未声明的标识符

d03b9fede06d4cd8babed12e58466902.png

所以我们想要获得命名空间域的内容,

using namespace dzt;

我们把这句代码加入到命名空间dzt下面就可以执行了。

这句代码的意思是:展开我的命名空间域dzt。


edee555485f5435da38c9c15a6e2960e.png

此时编译不会出现问题。

展开命名空间域 和 #include 的区别

编译过程中:

展开命名空间域是编译器会去命名空间域搜索。

#include 是将包含的头文件的内容拷贝过来。

二者不同,注意区分。

方法2:指定命名空间对象

//命名空间后面跟名字,这个名字是随便起的。
namespace dzt
{
  int a = 5;
}
//int a = 10;
int main()
{
  //int a = 0;
  printf("%d\n", dzt::a);
  return 0;
}

只需要使用 “域名::指定变量或函数” 这样的访问方式即可。

注意:对于命名空间域来说,展开了命名空间域后,相当于变成全局作用域了

比如:

int a = 10;
namespace dzt
{
  int a = 5;
}
using namespace dzt;
int main()
{
  printf("%d\n", a);
  return 0;
}

有一个全局变量a = 10,现在展开了命名空间域后,相当于全局域有a = 10 和a = 5,此时就会报a不明确的问题。

因为编译器不清楚这个a 到低是全局作用域的a还是命名空间域的a。

可以理解成,命名空间域就像是一堵围墙,一旦展开,相当于把围墙拆掉,围墙内的所有东西便会暴露出来。

总结:不要轻易展开命名空间域。

还有一个需要注意的点:

在不同的文件中创建相同名字的命名空间域,会自动将这些名字相同的命名空间域合并。

2.正确使用命名空间

上面讲过了如何使用命名空间的两种方法。

这里重述一遍:

**

1.使用using namespace 命名空间名称 引入

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

3.使用using将命名空间中某个成员引入**


在之后的学习中,推荐使用第二种和第三种的结合。

比如:

namespace dzt
{
  // 命名空间中可以定义变量/函数/类型
  int a = 0;
  int b = 1;
  int Add(int left, int right)
  {
    return left + right;
  }
  struct Node
  {
    struct Node* next;
    int val;
  };
}
using dzt::a
int main()
{
  printf("%d\n", a);
  return 0;
}

在一个命名空间域中,定义了多个变量和结构体以及函数。我们想访问该命名空间域的内容时,尽量不使用完全展开的方法,可以指定搜索某个变量即可。

总结:命名空间的出现是为了解决c语言的命名冲突问题。

三、C++中的输入和输出

C++中使用cout来进行输出,cin进行输入。

比如:

#include<iostream>
//引入库的头文件,该头文件包含cin,cout等关键字
using namespace std;
//让编译器可以去库里面搜索
int main()
{
  double a = 10;
  //cin包括但不限于scanf
  //  >>是流提取运算符
  cin >> a ;
  //cout包括但不限于printf
  // <<是流插入运算符
  cout << a << endl;
  return 0;
}

在C++中的cin和cout是会自动识别类型的,关于如何自动识别,涉及到函数重载问题,后续会讲到。


由于C++是包含C的,所以cin和cout这种输入输出的效率会比C低一点点,因为cin和cout会自动识别类型,涉及到更复杂的实现。


在不同的情况下,可以cin,cout,scanf,printf结合使用。

相关文章
|
11天前
|
编译器 C语言 C++
C++入门 | 命名空间、输入输出、缺省参数
C++入门 | 命名空间、输入输出、缺省参数
25 4
|
29天前
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
35 1
|
1月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
1月前
|
小程序 C++
【C++入门 二 】学习使用C++命名空间及其展开
【C++入门 二 】学习使用C++命名空间及其展开
|
1月前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
|
2月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
47 5
|
30天前
|
存储 编译器 C++
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
|
2月前
|
存储 编译器 程序员
C++一分钟之-auto关键字与类型推导
【6月更文挑战第21天】`auto`在C++11中重生,简化了类型声明,尤其在处理复杂类型时。它让编译器根据初始化值推导变量类型,减少了冗余和错误。使用`auto`简化了迭代器声明和函数返回类型推导,但也带来挑战:类型推导可能不直观,未初始化的`auto`是错误的,且过度使用影响可读性。使用`auto&`和`auto*`明确引用和指针,`decltype`辅助复杂类型推导,保持适度使用以维持代码清晰。
34 1
|
2月前
|
Unix 编译器 C语言
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
17 0
|
2月前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
26 0