C++第一节课入门
首先创建文件的后缀不再是.c而是.cpp,C语言大多数代码和函数在CPP中同时兼容。 输入输出不同的是现在要理解输入流cin输出流cout,在代码顶部的库也由stdio.h变成iostream 它是标准的输入输出流的库定义了标准的输入输出对象。 C++的输入输出可以自动识别变量类型,不再需要像C语言一样手动指定格式
namespace的定义:{}内的命名空间的就是命名空间,可以定义变量/函数/类型等
如图
此时在这里开辟了一个域,它和全局域各自独立,不同的域可以定义同名的变量,而在主函数中的使用,则需要::的指定引用
在学习局部域后,查找一个变量的声明或定义时可能会报错,所以我们需要使用命名空间中定义的变量/函数。有三种方式:
1、指定命名空间访问,常用。
2、using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
3、展开命名空间中全部成员,冲突风险大。
using dz::a;//将命名空间中某个成员展开
using namespace dz//展开命名空间中全部成员
缺省参数
很简单的一个定义,就是在函数的参数中给参数赋予一个值,全部赋值为全缺省,只给部分参数就是半缺省,但C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
在带缺省参数的函数调用中,C++规定必须从左往右一次给实参,不能跳跃给实参。
函数的声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须在声明中给缺省值。
函数重载
C++支持在同一作用域出现同名函数,但有要求:参数不同,参数个数不同,参数类型不同。这样C++函数调用就表现出多态行为。(C语言是不支持的)
引用
引用在定义时必须初始化!
一个变量可以有多个引用
引用一旦引用一个实体就不能再引用其他实体
引用的实践主要是传参和做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象
const引用
const引用对象的权限只能再引用过程中缩小,不能放大。
需要注意的是类似
int^ rb=a*3;doubled=12.34;int& rd=d;
这样一些场景下a*3 的和结果保存在一个临时对象中,int&rd =d也是类似,在类似转换中会产生临时对象储存中间值,而rb和rd引用的都是临时对象,而C++规定临时对象具有常性,所以就触发了权限放大,所以要用常引用才可以。
指针和引用的关系
在语法上,引用是一个变量取别名不开空间,指针是储存一个变量地址,要开空间。
引用在定义时必须初始化,指针建议初始化但不必须。
引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以不断改变指向对象。
引用可以直接访问对象,而指针需要解引用才是访问指向的对象。
sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台站4个字节,64位下是8byte)
指针容易出现空指针和野指针情况,引用很少出现,相对来说安全一些。
inline
用inline修饰的函数叫内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内联函数就需要建立栈帧了,可以提高效率。
C语言实现宏函数会在预处理时替换展开,但是实现很复杂很容易出错,且不方便调试,C++设计inline目的就是代替C的宏函数
vs编译器debug版本下默认时不展开inline的,这样方便调试。
inline不建议声明和定义分离到两个文件,会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。
nullptr
C++中NULL可能被定义位字面常量0或者为无类型指针(void*)的常量,想要通过f(NULL)调用指针版本的f(int*)函数,但由于NULL被定义为0,调用了f(int x),会造成f((void*)NULL)调用时会出错。
nullptr可以任意转换成其他类型的指针类型。nullptr只能隐式地转换为指针类型,而不能被转换为整数类型。所以C++11中引入nullptr解决了这个bug。