1.c++中的关键字
C++总计63个关键字,C语言32个关键字。
2.命名空间
(std是所有c++库的命名空间)
为什么会有命名空间?
解决C语言中命名冲突的问题。
解决方法:采用域作用限定符(::) :指定编译器搜索的位置。
编译器默认的搜索顺序:先局部再全局。
命名空间域
大体有4种域:全局域、局部域、命名空间域、类域。
命名空间域的特点:
1.不会影响生命周期。
2.只能定义在全局,具有隔离作用。
3.当函数命名相同时会将两个域合并。
命名空间的三种使用方法
(展开:开放访问限权)
1.命名空间 + ::
2.单独展开一个 using + 命名空间 + :: + 所需要使用的作用符
3.全展开 using namespace 命名空间
特:命名空间内可以随意套娃。
3.c++中的输入&输出
1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符。
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识.
4.缺省参数
分类和特性
1.半缺省参数
特点:缺省参数从右往左依次序给,不能间隔和跳跃。
2.全缺省参数
特点:传参的顺序从左往右依次,不能跳跃。
注意:缺省值必须是常量或者全局变量
特别:缺省参数不能同时在函数声明(.h文件)和定义中出现.给缺省值在声明中给(.h文件)。
5.函数重载
构成重载的条件
1.参数的类型不同
2.参数的个数不同
3.参数的类型顺序不同
特别:如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
C语言不支持函数重载的原因
程序运行的几个阶段
预处理:展开头文件、宏替换、条件编译、去注释。
编译:检查语法并生成汇编代码。
汇编:把汇编代码转成二进制机器码。
链接:将上述生成文件合并生成可执行文件。
6.引用 &
引用不是定义一个新变量,而是给已存在的变量取一个别名。且编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
特点
1.引用在定义时必须初始化。
2.一个变量可以有多个引用。
3.引用一旦引用一个实体,就不能引用其他实体。(不能改变指向)
常引用
传具有常性的量作为参数时要加const 例:
原因:权限可以缩小,但不能放大。
使用场景
1.做函数参数
2.做返回值
注意:如果函数返回时,出了函数作用域,如果返回对象还在(没有还给系统),则可以使用引用,如果已经还给系统,则必须用传值返回。
传值和传引用的区别
传值返回:传递实参或者返回变量的一份临时的拷贝。
传引用返回:传递实参或者返回变量的别名。(效率更高)
引用和指针的区别
语法上:
引用:引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
指针:指针是一个地址,需要开空间。
底层上:引用是按照指针方式实现的。(也是开了空间的!)
引用和指针在功能上是类似的,但是引用不能替代指针!!!
原因:引用定义后不能改变指向。 (引用不能实现链表,用指针实现)
7.inline(内联函数)
含义:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
未展开:
展开后:
特点
1 . inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。
(递归函数不会展开 ,行数过多也不会展开)
缺陷:可能会使目标文件变大。
优势:少了调用开销,提高程序运行效率
2 . inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到。
声明和定义分离相关知识
为什么要声明和定义分离?
防止链接错误问题。
做法:声明都包含于(.h)头文件中,而定义都在(.cpp)文件中。 这样可以避免链接时两个文件生成的合并后造成重定义问题。
题外:#pragma once
8.auto关键字(c++11)
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量、
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。(自动推导类型)
小知识:使用 typeid(函数).name()可以打印类型。
注:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
使用方法
1.auto与指针和引用结合起来使用
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
加 &
2.在同一行定义多个变量当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
auto不能用的地方
1.不能做函数的参数
2..不能声明数组
9.范围for
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
注:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
使用条件
1.for循环迭代的范围必须是已知的.
2.迭代的对象要实现++和==的操作。
3.打印或修改数组需注意
10.指针空值nullptr (c++11)
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void
*)0。
使用注意
1.在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
2.在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。。
3.在c++代码中表示空值指针时都用nullptr。
小编自语(以上资料来自于网课资源和本人个人学习总结,用于自己后续的复习。会根据以后的学习不断完善、更新,欢迎大家和我一起讨论学习)