C++入门——与C语言的衔接部分
C++ 入门
1、我的第一个C++程序
由于C++是在C语言的基础下修改而来的,故C++语法大部分兼容C语言,所以即使在C++中使用C语言也没有任何问题(个别特例除外),由此可以引出第一个C++程序。
#include<stdio.h>
//C语言版hello C --> C++语法兼容C语言
int main()
{printf("hello C");return 0;
}//C++版hello C++
#include<iostream>
using namespace std;int main()
{cout << "hello C++" << endl;return 0;
}
2、命名空间(namespace)
2.1、C++中的域
C++在C语言的基础上拓展了两个域——类域和命名空间域,因此一个C++程序中共有四个域,分别为局部空间域、全局域、类域、命名空间域。其中新增的类域与命名空间域一般情况下是独立的,不干扰局部域和全局域,两者也相互不干扰,特殊情况下会影响全局域与局部空间域(如类域中的成员被static修饰后会影响全局域和局部空间域,再如命名空间域被使用using打开后也会影响全局域和局部空间域)。
2.2、namespace关键字
namespace是声明命名空间域的关键字,利用namespace关键字能够声明一块自己想要增加的域。语法如下:
namespace name//name可以随便改,通过name可以调用内部的成员
{//在命名空间中可以定义变量、函数、以及类型
}
2.3、namespace的使用
预备知识:域访问操作符::,::是C++中用于调用类域和命名空间域的操作符,通过域名+::+成员的方 式可以访问到指定类域下的成员。
using关键字,using关键字能够将命名空间域中的某个成员展开到全局域,也能够直接将整个命名空间域直接展开,通过using关键字能够有效的将全局域和命名空间域联系起来。
a、指定命名空间访问
b、using将命名空间中的某个成员展开
c、using展开整个命名空间域
例:用namespace创建一个类域并使用当中的成员
a、指定命名空间访问
b、using展开某个成员
注意:使用该方法时,val已经被直接展开到全局域了,如果全局域中有与该变量名称相同的则可能造成冲突,因此在大项目中一般不适用该方法。其他如函数也可以直接展开到全局域,这里就不再示范了。
c、展开所有成员
日常学习和测试代码中经常用到这种方法,但在实际工作中一般不能用这种,因为工程较大极有可能出现命名冲突的情况。
至此我们可以解释在第一个C++程序中出现的using namespace std;这句语法了,其中需要知道std是C++的标准库,std为命名空间域,它包含着标准输入输出和标准错误的函数定义和其他,故而这句语法的意思是将std这个命名空间域里面的内容直接展开到全局域当中。
2.4、补充:
1.局部域和全局函数域影响程序的查找逻辑同时也影响变量的生命周期,而类域和命名空间域仅影响程序的查找逻辑。
2.namespace只能定义在全局域,同时支持嵌套定义。
3.多个同名的namespace会被编译器认为是同一个命名空间域。
3、C++的输入输出
1.<iostream>是C++标准输入、输出流库,定义了标准的输入、输出对象。
2.<< 流插入运算符,>> 流提取操作符。
3.C++支持自动识别变量类型,无需指定对应的格式。
4.std::cin-窄字符的标准输入,std::cout-窄字符的标准输出。
与C语言类似地,C++的标准输入和输出都定义在一个头文件内,即iostream中,暂时只需要把其记住即可,后面会慢慢学到。紧接着是流插入(<<)和流提取(>>),在C阶段我们知道,流是一个抽象的概念,通过流能将键盘输入、文件读取、网络加载的内容导入程序,相应的也能够从程序中插入到显示器、文件、网络当中。而此处流插入<<就相当于是将流中的信息插入到cout(标准输出)当中,流提取>>就相当于是将cin(标准输入)提取到流指向的地方当中。
4、函数的默认参数(缺省参数)
4.1、概念
所谓默认参数,就是在函数定义时为参数开一个默认值,加了默认值的参数在函数调用时如果没有给参数值则直接使用定义时的默认值直接传入。
4.2、注意事项
1.全缺省是在定义时全部附上默认参数。
2.半缺省,在某处加上默认值后,从该处起后面的参数都应加上缺省值。
3.函数声明和定义分离时,规定必须在函数声明给缺省值。
5、函数重载
5.1、概念
C++支持同一作用域内出现同名函数,但要求同名函数的形参不同,可以是参数个数,参数顺序或者参数类型不同。
5.2、注意事项
当一个函数同时存在空参数和单参数两个重载版本时,尽量不要给单参数附加上默认值即缺省参数值,否则在调用空参数版本时会存在歧义。
6、引用
6.1、引用的概念及定义
概念
引用是对已存在的变量取别名,引用变量与原变量共用同一块空间。
定义
类型& 引用变量 = 引用对象;
6.2、引用的使用
由于引用变量与实体对象共用同一块空间,使用引用变量就相当于间接使用该实体对象,通过 引用传参 能够解决指针传参的复杂性,通过 引用做返回值 能够简化代码便于阅读、减少拷贝提高效率和对方便对同一块空间进行操作等优点。
引用传参
引用做返回值
6.3、引用的特性
a、引用在定义时必须初始化
b、同一个变量可以有多个引用
c、引用一旦有实体,就不能引用其他实体了
6.4、const引用
在C语法中const关键字主要用于两个场景,分别为const修饰变量和const修饰指针。而在C++中,const的用法被拓展到引用、函数、以及类成员等语法当中。在const修饰引用时有以下两点需要注意:
const的引用引用变量
a、const的引用引用普通变量
普通变量默认权限有读取和修改,被const修饰的引用变量仅有只读的权限,所以当const引用为普通变量取别名时会出现权限缩小的情况。
b、const的引用引用const变量
const修饰普通变量时,该普通变量被设置为只读,当用含有const的引用对象来为该只读变量改名时,该引用也被默认设置为只读。但当用非const的引用来为该只读变量改名时,编译器会报错,这是因为原只读变量为只读状态,当用非const引用来为该变量取别名后会让权限放大,这种情况与C语言阶段的指针很像,属于越过语法修改变量的操作。但在C++中不允许这样做,因此会直接报错。如下所示:
总结:引用的权限可以缩小,但不能放大
const的引用引用临时对象(常量引用)
临时对象是C++中一个特殊的空间,用于存储临时数据而开辟的临时的未命名空间,这块空间被称为临时对象。当使用const修饰引用后,可以用其来为常量改名。因为在使用常量来为变量赋值过程中并不是直接赋值的,而是先为常量创建一块临时空间用以存储数据,再将该临时空间的内容复制到变量中。
可能需要用临时空间来存储的情况:常量赋值、表达式运算结果、类型转换等
7、内联函数(inline)
7.1、概念
内联函数是C++为了解决宏展开问题而设计的语法,内联函数可以在调用时直接展开到函数体内部无需建立栈帧。
7.2、内联函数的使用
内联函数的定义:inline + 返回值 + 函数名(参数){};即直接在需要定义为内联函数的函数定义前面加上inline即可。
7.3、内联函数与宏函数的区别
1.宏函数仅做值的简单替换,而内联函数可以先算出表达式结果再传给内联函数的参数。
2.宏函数无法通过调试来判断执行逻辑,但内联函数在VS调试模式下可以查看执行逻辑。
注意:内联函数的定义和声明不能分开到两个文件中,否则会出现链接错误问题,因此一般直接在同一个文件中直接定义和实现。