【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++关键字,命名空间以及输入输出的内容啦~ 完结撒花~ 🥳🎉🎉🎉

相关文章
|
26天前
|
存储 缓存 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 的奥秘,从入门到高效编程
|
19天前
|
安全 编译器 程序员
C++ noexcept 关键字的关键作用
`noexcept` 关键字在 C++ 中扮演着重要角色,通过正确使用 `noexcept`,可以提升程序的性能、增强代码的可读性和安全性,并且有助于编译器进行优化。在编写 C++ 代码时,应仔细考虑每个函数是否应该声明为 `noexcept`,以充分利用这一特性带来的优势。通过本文的介绍,希望开发者能够更好地理解和应用 `noexcept` 关键字,从而编写出更加高效、健壮的 C++ 程序。
31 8
|
3月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
81 1
|
5月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
52 0
|
5月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
60 0
|
26天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
5天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
35 16
|
9天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
51 6
|
1月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)

热门文章

最新文章