前言:哈喽小伙伴们,从这篇文章开始,博主将开启新篇章的讲解——C++语言,那么C++是一门怎么样的语言呢???它的语法又是怎么样的呢???这篇文章将给你一一解答。
目录
一.C++是什么
二.C++关键字
三.命名空间
四.C++输入/输出
五.缺省参数
六.函数重载
七.引用
八.内联函数
九.auto关键字
十.基于范围的for循环
十一.指针空值nullptr
总结
一.C++是什么
C++是在祖师爷本贾尼·斯特劳斯特卢普 的带领下,在C语言的基础上,对C语言进行各种各样的优化设计,最终所诞生的一门新型的计算机编程语言。
C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
C++完全兼容C语言,这意味着一个C++文件可以完全用C语言来写,但是C语言文件却写不了C++的独特语法,在后边的讲解中,我们会时不时的将这两种语言进行对比。
二.C++关键字
C++中有很多关键字都来自于C语言,同时也有部分关键字是C++所独有的,这些关键字我们在这里不做过多解释,重要的关键字后边都会一一讲到。
三.命名空间
我们知道在C语言中,在同一个域内不能定义两个相同名字的变量:
比如说我们定义了两个全局变量a,它们都处于全局域中,就会报出重定义的错误。
但是在不同的域中却可以定义相同名字的变量:
并且会根据就近原则来输出变量。
但是在C++中,存在一个命名空间的概念,可以让两个同名变量处在同一作用域中:
如上图所示,命名空间的创建需要使用关键字namespace,我们在全局域中建立了两个命名空间,并分别命名为a1、a2,它们两个都存放名为a的变量。
想要使用这两个变量,需要用到域作用限定符“::”,在其前边加上命名空间的名字,便可访问对应命名空间中的变量了。
如果不使用域作用限定符,则默认只会在局部域搜索,局部域没有则搜索全局域。
值得注意的是,存放的命名空间中的变量虽然定义在全局域,但是如果不使用域作用限定符,是无法对其进行调用的:
除了变量之外,函数,结构体等等都可以在命名空间中定义。
值得注意的是,当两个命名空间同名时,并不会发生冲突,而是会将它们合并。如果合并之后存在同名的变量,则会报错。
但是命名空间也会存在一些问题,如下:
如果我们的命名空间中同时有很多个变量都需要被访问,那么我们需要不断地使用域作用限定符,这样就会显得有些繁琐,所以我们可以通过如下代码:
using namespace 命名空间名;
将命名空间按照类似于头文件的使用方法展开,这样命名空间中的变量就又变成全局变量了,不会收到命名空间的限制:
当然,我们也可以选择仅将命名空间中的若干个变量展开:
将命名空间展开虽然方便,但无疑可能又会导致命名冲突,所以不建议在很大的域中使用,仅建议在一个小域中图方便使用。
命名空间也可以嵌套使用:
要注意的是域作用限定符也需要嵌套使用。
四.C++输入/输出
cout<< 流输出
cin>> 流输入
想要使用它们需要使用头文件#include<iostream>,以及展开C++的标准库命名空间std:
using namespace std;
C++的输入输出可以摆脱格式化的输入输出方式:
能够看出cin和cout的输入输出不需要%d、%c等格式化方式,能够自动识别类型。
但是我们发现这么多变量的输出之间都没有间隔,这是因为cout的输出默认都是连着的,所以我们需要自己添加间隔:
五.缺省参数
我们先来看一段代码:
#include<iostream>
using namespace std;
int add(int x = 1, int y = 2)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum1 = add(a, b);
int sum2 = add();
cout << sum1 << endl;
cout << sum2 << endl;
return 0;
}
能够看到,以前在C语言中,add函数的形参我们都是没有初始化过的,但是在C++中,函数的参数都是可以初始化的,像这样初始化形式参数的函数,就叫做缺省函数。
sum1对应的函数有实际参数,而sum2对应的函数没有实际参数,它们的结果分别是什么呢??
能够看出,初始化了实际参数的sum1的结果为30,而未初始化实际参数的sum2的结果为3。
这能够说明,如果缺省函数有实参,则会将实参带入,反之则带入形参。
我们也可以在有多个参数的情况下,只传若干个实际参数:
这样也默认只会接收一个实参。
上述函数的两个形参我们都进行了初始化,这样的函数称为全缺省函数,当然也存在半缺省函数,也就是函数的部分形参初始化,但是没有初始化的参数必须靠左:
#include<iostream>
using namespace std;
int add(int x, int y = 2)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum1 = add(a, b);
int sum2= add(a);
cout << sum1 << endl;
cout << sum2 << endl;
return 0;
}
如上代码,半缺省函数我们只能让x不初始化,而不能将x初始化而y不初始化,因为实参的传入默认是从左向右的,所以如果y不初始化且没有实参传入时,就会报错了。
六.函数重载
在C语言中,同样不能存在同名的函数,但是在C++中,我们仍然可以实现,这就叫函数重载。
那么在C++中,函数重载的条件是什么呢???
- 参数类型不同
- 参数数量不同
- 参数顺序不同
以上展示的函数重载方式均可以实现。
七.引用
所谓引用,又叫起别名,就是给一个变量起一个新的名字:
类型& 新名 = 原名
给变量a起一个别名b,当a改变时,b也随之改变,说明两者就是一个变量的不同名字。
这样能够看出,引用在C++中就相当于是C语言的指针。
我们知道,在swap交换函数中,如果想要实现两个参数值的真正交换,需要传参数的地址,并用指针去接收。
但是在C++中,我们可以直接用别名做形参:
这样的写法比指针简单的多,需要顾虑的细节也少了。
在使用引用时,我们需要注意以下三点:
- 引用必须初始化(别名必须有主)
- 引用定义后,不能改变指向(一个别名不能被多个人使用)
- 一个变量可以有多个引用(一个人可以有多个别名)
虽然引用比指针好用,但是它并不能完全取代指针,因为它不能改变指向,所以对于链表,二叉树的操作就无法完成。
八.内联函数
我们知道,在C语言中,某些简单的函数可以使用写宏函数来代替,这是因为宏函数的使用不需要创建函数栈帧,能够加快代码的效率。但是宏函数同时也有很多缺点,比如宏不方便调试,代码的可读性差,可维护性差等等。
而在C++中,存在内联函数的定义,能够在保证函数形式不变的前提下,达到宏函数不创建栈帧而加快代码效率的效果,这需要使用到关键字inline:
#include<iostream>
using namespace std;
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int sum = add(a, b);
cout <<"sum = "<< sum << endl;
return 0;
}
内联函数的作用和宏一样,都是将函数内的代码替换函数的调用,这就存在着和宏一样的问题:
函数的代码过多以及函数的调用次数过多就会导致整体代码量过大,从而加重代码效率等等,所以内联函数虽然优化了一些宏函数的问题,但同时我们也不能将所有的函数都当做内联函数来使用。
九.auto关键字
auto称为自动识别类型关键字,用auto定义的变量能够自动识别其所访问的变量的类型作为自己的类型:
int a = 10;
auto b = a;
如上述代码,用auto定义的变量b访int型变量a,则变量b的也行即为int。
但是单纯的这样写好像也没有什么大用处,实际上这样确实没有用处,但是如果变量b要访问的是一个函数指针类型:
void(pf*)(void,void);
这种类型的书写过于复杂,所以我们就可以使用auto:
int add(int x, int y)
{
return x + y;
}auto b = add(x,y);
十.基于范围的for循环
在C++中,for循环有一种新的用法,如果我们已知要循环的范围大小,就可以用一种新的方式来进行迭代循环,这里以数组为例,因为对数组而言,其范围是确定的:
其中int是数组类型,e是作为一个临时拷贝参数来拷贝数组的元素并打印。 这样的for循环写法能够不断进行迭代,将数组元素赋值给e,并自动判断结束。
十一.指针空值nullptr
在C语言中,如果要将一个指针置空,我们知道要使用NULL,但是在C++中,NULL在底层代码中被宏替换为了0,也就是说在C++中,NULL实际上就是0。
而在C++中如果要将指针置空,需要使用新的关键字nullptr。
总结
关于C++的入门基础知识到这里就分享完啦,希望能够对刚刚学习C++的小伙伴们有所帮助。
喜欢博主文章的小伙伴们记得一键三连哦,我们下期再见!