0.前言
C++是一门非常好的编程语言,但可能在学习C++的过程中会遇到很多困难。人们常说 “一个人走得很快,一群人会走的更远”, 所以就让我们一起攻坚克难,一起征服C++吧!从本章开始,我们将开始C++的基础学习!一起加油吧!🎠🎠🎠
1.什么是C++
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
2.C++关键字
C++总计63个关键字,C语言32个关键字
asm | do | if | return | try | continue |
---|---|---|---|---|---|
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
3.命名空间
①像下面这样,我们在命名全局变量的时候并不知道C语言库里面的函数,这时候就会发生命名冲突②还有当我们在公司分模块写代码的时候,我们并不知道别人是怎样命名函数、全局变量的,也可能引发命名冲突。
一个栗子:
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("%d\n", rand);
return 0;
}
代码运行的结果:
C语言不能很好的解决命名冲突的问题,而在C++中使用了命名空间对标识符的名称进行本地化,以避免命名冲突或名字污染;而定义命名空间,需要使用到
namespace
关键字,后面跟命名空间的名字(注意不需要在{}
后面加逗号),然后接一对{}
,{}
中为命名空间的成员,把变量封装在命名空间域中,防止引起命名冲突。
3.1命名空间的定义
命名空间形式如下:
namespace phh
{
int rand = 1;
}
现在我们已经命名好了,那么该怎么访问命名空间里面的变量呢?这时候我们要使用
::
域作用限定符,左边空白表示全局域去访问全局变量,左边是命名空间的名字则回去命名空间域访问命名空间的成员变量。
eg:
#include<stdio.h>
int a = 1;
//namespace是C++的关键字,后面跟的是命名空间的名字
//然后加一对{}括号即可(注意不需要在{}加逗号)
//把全局变量封装在命名空间域中,防止引起命名冲突
namespace phh
{
int a = 2;
}
//::域作用限定符
//左边空白,会去全局域访问
int main()
{
int a = 0;
printf("%d\n", a);
printf("%d\n", ::a);
printf("%d\n", phh::a);
return 0;
}
代码运行的结果如下:
这时候我们就可以用C++解决与库里面命名冲突问题了
#include<stdio.h>
#include<stdlib.h>
namespace phh
{
int rand = 1;
}
int main()
{
printf("%d\n", phh::rand);
printf("%p\n", rand);//库里面的rand是函数,函数名为地址
return 0;
}
代码运行的结果如下:
3.2命名空间的特性
1.正常的命名空间定义–可以定义变量/函数/类型
namespace phh
{
int rand = 10;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
2.命名空间可以嵌套使用
#include<stdio.h>
namespace N1
{
int a = 0;
int b = 0;
int Add(int left, int right)
{
return left + right;
}
namespace N2
{
int a = 1;
int c = 0;
int d = 0;
int Sub(int left, int right)
{
return left - right;
}
}
}
int main()
{
printf("%d\n", N1::a);
//嵌套的命名空间还可以使用同一个变量名
printf("%d\n", N1::N2::a);
//也可以把函数封装在命名空间域中,然后通过指定空间域进行访问
printf("%d\n", N1::Add(1, 2));
return 0;
}
代码运行的结果如下:
3.同一个工程中可以存在多个相同的名称,编译器最后会合并成同一个命名空间
//Queue.h
namespace N1
{
int x = 1;
}
//Stack.h
namespace N1
{
int y = 2;
}
#include<stdlib.h>
#include"Queue.h"
#include"Stack.h"
int main()
{
//printf("%d\n", N1::x);
printf("%d\n", N1::y);
return 0;
}
代码运行的结果如下:
注意: 如果
Queue.h
和Stack.h
的N1
中使用了同一个变量名,会发生命名冲突,这时候可以使用命名空间嵌套或定义不同命名空间的名字。
3.3命名空间的使用
命名空间使用三种方式:
①加命名空间的名称及作用限定符
#include<stdio.h>
int a = 1;
namespace phh
{
int a = 2;
}
int main()
{
int a = 0;
printf("%d\n", a);
printf("%d\n", ::a);
printf("%d\n", phh::a);
return 0;
}
这种方法,需要对命名空间域进行多次访问,会显得代码冗余;建议在访问次数少的时候使用。
②使用using namespace 命名空间名称引入
#include<iostream>
namespace phh
{
int a = 1;
int b = 1;
}
using namespace phh;
//相当于把命名空间中的成员变量放到了全局域
int main()
{
int a = 0;
printf("%d\n", a);
printf("%d\n", ::a);
return 0;
}
代码运行的结果如下:
这种方法,把命名空间域中的变量放到全局域中可能会引起命名冲突,一般建议在日常练习中使用。
③使用using将命名空间中的某个成员引入
#include<stdio.h>
int b = 0;
namespace phh
{
int a = 1;
int b = 1;
}
using phh::a;
int main()
{
printf("%d\n", a);
return 0;
}
代码运行结果如下:
不建议把命名空间的里变量全部展开,存在风险,可以指定成员访问或把常用的展开,推荐使用这种方法。
4.C++输入&输出
C++学习须知:
1.
std
是C++标准库的命名空间命名,C++标准库的定义实现都放在这个命名空间中
2.cout
是标准输出对象(控制台),cin
是标准输入对象(键盘),endl
是特殊的C++符号,相当于换行符\n
3.cout\cin\endl
被定义在std(C++标准库的命名空间)中,需要包含头文件#include<iostream>
需要按命名空间的使用方法才能使用
4.cout\cin
可以自动识别变量类型,可以一次读取多个变量(也就是不用像C语言中printf\scanf
那样指定变量的格式读取、输出多个变量)
5.在以.cpp
为后缀的文件中,C语言、C++混用的时候,使用printf/scanf
比cout\cin
效率高一点,因为C++要兼容C语言,所以C++、C语言有各自不同的缓冲区,所以在输入输出前需要检查C语言缓冲区是否有东西,会影响效率。
一个栗子:
//C++的输入和输出
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
int x = 0;
double b = 0;
cin >> x>>b;
cout << x <<" "<< b << endl;
return 0;
}
代码运行的结果如下:
std命名空间的使用惯例:
1.在日常练习中,建议直接
using namespace
即可,这样很方便。
2using namespace std
展开,标准库就全部暴露出来,如果我们定义的变量跟库里面的类型/对象/函数,就存在冲突问题,所以在项目开发中建议展开某个库里面的成员变量,如需要使用cout
,就建议using std::cout
。
总结
本章我们一起学习了C++的一些细则,如命名空间、输入输出,了解了C++与C语言的不同之处,内容不多,但很重要哦!希望对你们了解C++有些许帮助!感谢大家阅读,如有不对,欢迎纠正!🎠🎠🎠