📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持
目录
- 🎄 前言
- 1. C++关键字(C++98)
- 2. 命名空间
🎄 前言
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标:
- 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用
域方面、IO方面、函数方面、指针方面、宏方面等。 - 为后续类和对象学习打基础
1. C++关键字(C++98)
C++总计63个关键字,C语言32个关键字
ps:下面我们只是看一下C++有多少关键字,不对关键字进行具体的讲解。后面我们学到以后再细讲。
2. 命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
先来写一段简单C++代码
进入一个语言世界肯定是从hello world开始啦
作为对比先来C语言版本的:
#include<stdio.h>
int main()
{printf("hello world");return 0;
}
再来看C++版本
#include<iostream>
using namespace std;
int main()
{cout<<"hello world"<<endl;return 0;
}
我们都知道在C语言文件中源文件后缀都是.c
但是在.cpp文件里,这两个代码都可以运行
输出结果都是
hello world
可是我们的头文件以及输出方式却完全不一样
C++首先兼容C语言的知识,C语言的知识在C++都可以用
C++还有面向对象,泛型以及对C语言不足的弥补
接下来我们正式介绍C++语言的基础
就是这个头文件以及下面using namespace std;这都是什么,还有这输出方式怎么看不懂
我们先来看一个例子:
#include<stdio.h>
int rand = 0;
int main()
{printf("hello world");printf("%d",rand);return 0;
}
这个时候运行非常成功
我们将代码改一下
你会发现只是添加了一个头文件
#include<stdio.h>
#include<stdlib.h>
int rand = 0;
int main()
{printf("hello world");printf("%d",rand);return 0;
}
这个时候运行会出错
看报错我们发现出现的是命名冲突
rand重定义了
命名冲突主要分为
- 我们写的跟库冲突
- 我们写的互相之间冲突
这种命名冲突在C语言中的经典的问题,项目越大,我们会出现命名冲突就会越多
c++中就出现了命名空间 —> namespace
接下来我们来看namespace的用法:
定义一个命名空间
#include<stdio.h>
#include<stdlib.h>namespace bay
{int rand = 0;
}int main()
{printf("hello world");printf("%d",rand);return 0;
}
我们会发现运行成功了
命名空间就相当于一堵墙,将rand围起来了,我们就会访问不到,系统会去找那个全局rand,在这里全局的rand是一个函数名,系统就会出现提醒,提示不要这样使用
那我们如何访问我们命名空间里面的rand呢?
#include<stdio.h>
#include<stdlib.h>namespace bay
{int rand = 0;
}int main()
{printf("hello world");printf("%d",bay::rand);return 0;
}
我们在rand前加入我们的名字bay::
名称后面的冒号叫做(::)域作用限定符
这样我们就可以随便进行重复命名变量,还可以访问我们需要的变量
以后如果想避免冲突就可以采用这种方式了
如果在自己定义的命名空间出现命名冲突怎么办?
我们能想到的开发者也能想到,所以我们在命名空间里可以嵌套命名空间,可以无限套娃
提示:我们在同一个文件定义命名空间以及多个文件中国定义命名空间,如果名称相同,编译器会认为是一个命名空间,不会发生冲突,反而会将他们合并哦
那我们想使用自己定义的命名空间,再使用其中的内容是不想带那个前缀应该怎么办?
我们在头文件下面加上 using namespace 【命名空间名称】;
这样我们就可以随便使用,如果使用和里面的空间相同名称的变量,我们就会默认使用这个命名空间定义的变量,不需要加前缀。
现在我们回到一开始,using namespace std;
这句话的意思就是我们的代码就是在使用std命名空间里面的内容
所以我们使用其中的东西就不用再带上std::这个前缀
std是c++官方库定义的命名空间
#include<iostream> --->>头文件 输入输出流int main()
{std::cout<<"hello world"; -->>C语言的移位运算符,C++的流插入运算符 --->>没有带命名空间使用 要加前缀int a=10;double b=11.11;std::cout<<a;std::cout<<b; -->>C++能自动识别输出的变量类型std::cout<<a<<b<<"\n";std::cout<<a<<b<<std::endl; -->>C++可以连续输出,endl相当于C语言里面的\n,在这里等同于换行,endl是C++里面自定义的换行符return 0;
}
我们每次指定命名空间很不方便,但是将命名空间全部展开又有冲突的风险
我们采用指定展开可以解决问题
using std::cout;
using std::endl;
这两个变量就被展开了,在内容里就不用加前缀了
我们就可以指定展开想要的变量或者函数都可以,这样我们的程序就可以变的非常的方便了
我们C语言里面的scanf
在C++里面就是std::cin,又叫做流提取