【C++入门】关键字、命名空间以及输入输出

简介: 【C++入门】关键字、命名空间以及输入输出

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标:


  1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用 域方面、IO方面等。
  2. 为后续类和对象学习打基础。

1. C++关键字(C++98)

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

ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再细讲。

2. 命名空间

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

这里简单来说,命名空间的出现是为例防止名字重名而出现的冲突,只要将相同的名字规定在不同的空间(也就是命名空间)就可以避免冲突,就可以出现相同名字的情况,根本原因就是它们在不同的命名空间内使用,所以不会冲突;接下来我们举几个例子来看:

#include <stdio.h>
// #include <stdlib.h>
 int rand = 10;
 // C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
 {
    printf("%d\n", rand);
 return 0;
 }

我们看到此时我们没有包含stdlib头文件// #include <stdlib.h>结果如下:

当我们把stdlib头文件包含进去:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{
    printf("%d\n", rand);
    return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

结果如下:

所以C++通过提出命名空间来解决类似的情况🥳🥳

2.1 命名空间定义

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

2.1.1 正常的命名空间定义

 // tutu是命名空间的名字,一般开发中是用项目名字做命名空间名。
 // 1. 正常的命名空间定义
namespace tutu
 {
    // 命名空间中可以定义变量/函数/类型
    //(1)命名空间中定义变量
    int rand = 10;
    //(2)命名空间中定义函数
    int Add(int left, int right)
    {
        return left + right;
    }
    //(3)命名空间中定义类型
    struct Node
  {
    struct Node* next;
    int val;
  };
  }

2.1.2命名空间嵌套定义

 //2. 命名空间可以嵌套
// test.cpp
 namespace N1
 {
   int a;
   int b;
   int Add(int left, int right)
   {
   return left + right;
   }
   //嵌套N2
   namespace N2
   {
    int c;
    int d;
    int Sub(int left, int right)
      {
     return left - right;
      }
   }
 }

2.1.3相同名称的命名空间

 //3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
 namespace N1
 {
  int Mul(int left, int right)
  {
   return left * right;
  }
 }

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

2.2 命名空间使用

学会了怎么定义命名空间,那么命名空间中成员该如何使用呢?

例如:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace tutu
{
    
    int a = 0;
    int b = 1;

    int Add(int left, int right)
    {
        return left + right;
    }
   
    struct Node
    {
        struct Node* next;
        int val;
    };
}
int main()
{
    // 编译报错:error C2065: “a”: 未声明的标识符
    printf("%d\n", a);
    return 0;
}

✨✨✨命名空间的使用有三种方式

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

int main()
 {
 printf("%d\n", N::a);//N是指你的命名空间名称,这里是tutu
 return 0;    
}

N是指你的命名空间名称,这里是tutu

作用域限定符:::

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace tutu
{
    
    int a = 0;
    int b = 1;

    int Add(int left, int right)
    {
        return left + right;
    }
   
    struct Node
    {
        struct Node* next;
        int val;
    };
}
int main()
{
    // 编译报错:error C2065: “a”: 未声明的标识符
    printf("%d\n",tutu::a);
    return 0;
}

结果如下:

2.2.2使用using将命名空间中某个成员引入

using N::b;
 int main()
 {
 printf("%d\n", N::a);
 printf("%d\n", b);
 return 0;    
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace tutu
{
    
    int a = 0;
    int b = 1;

    int Add(int left, int right)
    {
        return left + right;
    }
   
    struct Node
    {
        struct Node* next;
        int val;
    };
}
using tutu::b;
int main()
{
   
    printf("%d\n", b);
    return 0;
}

结果如下:

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

using namespce N;
 int main()
 {
 printf("%d\n", N::a);
 printf("%d\n", b);
 Add(10, 20);
 return 0;    
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
namespace tutu
{
    
    int a = 0;
    int b = 1;

    int Add(int left, int right)
    {
        return left + right;
    }
   
    struct Node
    {
        struct Node* next;
        int val;
    };
}

using namespace tutu;
int main()
{
    printf("%d\n", a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;
}

结果如下:

我们平常所见的using namespace std;就是使用第三种引入

std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中,例如接下来我们要实现的输入输出;

3. C++输入&输出

#include<iostream>
 
using namespace std;
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
int main()
{
    cout << "Hello world!!!" << endl;
    cout << "Hello C++!!!" << endl;
    return 0;
}

结果如下:

using namespace std;
int main()
{
    int a;
    double b;
    char c;
    // 可以自动识别变量的类型
    cin >> a;
    cin >> b >> c;
    cout << a << endl;
    cout << b << "  " << c << endl;
    return 0;
}

上述代码表示在键盘上输入a,b,c的值后打印出来:

✨✨✨注意:

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
    cout << "Hello world!!!" << endl;

这里可以表示Hello world!!!流向了cout,向控制台输出;

4.使用.C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。

5.实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识, 所以我们这里只是简单学习他们的使用。

std命名空间的使用惯例:

std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对 象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

4.结语

以上就是有关C++关键字,命名空间以及输入输出的内容啦~ 完结撒花~ 🥳🎉🎉🎉

相关文章
|
6月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
281 0
|
6月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
99 0
|
10月前
|
存储 缓存 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 的奥秘,从入门到高效编程
|
9月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
10月前
|
安全 编译器 程序员
C++ noexcept 关键字的关键作用
`noexcept` 关键字在 C++ 中扮演着重要角色,通过正确使用 `noexcept`,可以提升程序的性能、增强代码的可读性和安全性,并且有助于编译器进行优化。在编写 C++ 代码时,应仔细考虑每个函数是否应该声明为 `noexcept`,以充分利用这一特性带来的优势。通过本文的介绍,希望开发者能够更好地理解和应用 `noexcept` 关键字,从而编写出更加高效、健壮的 C++ 程序。
337 8
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
189 0
|
8月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
324 12
|
9月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
189 16