免费seo快速收录工具,迈步者seo,搭建cms网站,商业空间设计公司目录 1、C关键字
2、命名空间
2.1 命名空间的定义
2.2 命名空间的使用
2.2.1 加命名空间名称及作用域限定符
2.2.2 使用using将命名空间中某个成员引入
2.2.3 使用using namespace 命名空间名称引入
3、C输入输出
4、缺省参数 4.1 缺省参数的概念
4.2 缺省参数的…目录 1、C关键字
2、命名空间
2.1 命名空间的定义
2.2 命名空间的使用
2.2.1 加命名空间名称及作用域限定符
2.2.2 使用using将命名空间中某个成员引入
2.2.3 使用using namespace 命名空间名称引入
3、C输入输出
4、缺省参数 4.1 缺省参数的概念
4.2 缺省参数的分类
4.2.1 全缺省参数
4.2.2 半缺省参数
5、函数重载
5.1 函数重载概念
5.1.1 在同一作用域中
5.1.2 参数类型不同
5.1.3 参数个数不同
5.1.4 参数顺序不同
5.2 C如何支持函数重载为什么C语言不支持
6、引用
6.1 引用的概念
6.2 引用特性
6.3 常引用
6.4 使用场景
6.4.1 做参数
6.4.2 做返回值
编辑
6.4.3 引用做参数和做返回值提高效率对比
6.4.4 引用和指针的区别
7、内联函数
7.1 概念 7.2 特性
8、auto关键字(C11)
8.1 auto简介
8.2 auto的使用规则
8.3 auto不能推导的情景
9、基于范围的for循环(C11)
9.1 范围for的语法
9.2 范围for的使用条件
10、指针空值nullptr(C11) 1、C关键字
C关键字有63个C语言关键字有32个 2、命名空间
在C/C中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存 在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化以避免命名冲突或命名污染namespace关键字的出现就是为了解决这个问题。
此时会报错因为头文件cstdlib中包含了rand函数而在全局变量中又有rand变量命名冲突了(注意这里如果把rand定义为局部变量则不会报错因为局部优先)
2.1 命名空间的定义
namespace命名空间的名字{}{}中就是命名空间的成员。
在命名空间中可以定义变量函数类型命名空间 注意一个工程中允许出现多个名字相同的命名空间若这些命名空间中没有名字相同的变量则编译器最后会合成到同一个命名空间中若这些命名空间中有相同名字的变量则编译时会报错 2.2 命名空间的使用
2.2.1 加命名空间名称及作用域限定符 2.2.2 使用using将命名空间中某个成员引入
此时是将命名空间中某个变量、函数、类型、命名空间展开 2.2.3 使用using namespace 命名空间名称引入
此时时间整个命名空间中的所有东西展开 编译器默认查找 a. 当前局部域 b. 全局域 c. 到展开的命名空间中 在不指定命名空间的情况下查找顺序是a-bc在其中一个找到后就不会再往后寻找若指定了命名空间则直接取命名空间中寻找 所以若将命名空间整个展开且全局变量中有与这个命名空间中相同的内容会报错 而若是两个命名空间中有相同的内容且都展开了那么就会报错 定义了命名空间就是创建了命名空间域 全局域和局部域会影响变量的生命周期 命名空间域不会影响变量的生命周期(在命名空间中的变量是全局变量)只是限定了域(影响了编译器的查找规则因为正常情况下只会有上面的a、b两点) 注意展开命名空间不等于展开头文件展开命名空间是影响了编译器的查找规则相当于加了声明 若要修改命名空间中的值需要在主函数中修改不能在主函数外修改这一点与全局变量相同 C库中的所有东西都放在std库中 补充一个题外话在局部优先的情况下若想要使用全局变量可以在变量前加:: 3、C输入输出 C输入使用cin输出使用cout换行使用endl他的都定义在std标准库中 头文件都是iostream 同时C语言的scanfprintf\n都是可以使用的 stdio.h包含在iostream中 4、缺省参数 4.1 缺省参数的概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实 参则采用该形参的缺省值否则使用指定的实参。
4.2 缺省参数的分类
4.2.1 全缺省参数 4.2.2 半缺省参数 注意 a. 半缺省参数必须从左向右依次给出不能间隔给出 b.给含有缺省参数的函数传值时必须按顺序传不能跳着传 c.缺省参数不能在函数声明和定义中同时出现。通常是在函数定义时不给缺省参数而在函数声明时给出 d.缺省参数必须是常量或全局变量 对于上面c的解释 5、函数重载
5.1 函数重载概念 函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。 5.1.1 在同一作用域中 此时不构成函数重载因为两个函数不在同一作用域中他们在不同的命名空间域中 就算把N1、N2都展开任然不是函数重载因为任然不是在同一作用域中展开不是变成全局变量而是让编译器可以到里面去找
5.1.2 参数类型不同 5.1.3 参数个数不同 5.1.4 参数顺序不同 函数重载对返回值是没有要求的即只要满足三个的其中一个且在同一作用域中不管返回值是否相同都可以构成函数重载但若只有返回值不同是不能构成函数重载的 5.2 C如何支持函数重载为什么C语言不支持
想要了解这个问题需要先了解代码编译链接的过程以C语言代码为例 问题就出现在链接的过程中 6、引用
6.1 引用的概念 引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。 通过引用还可以将之前的单链表做修改 6.2 引用特性 a. 引用在定义时必须初始化 b. 一个变量可以有多个引用 c. 引用一旦引用一个实体就不能再引用其他实体 6.3 常引用 引用时变量的访问权限可以缩小不能放大 除了引用有权限缩小放大的规则外指针也有 注意权限放大和缩小对于整型 这里说明一下const int*和int* const const int* p: 表示p是指向const int类型的指针即p所指向的内存空间的值不能被修改但是指针p本身是可以被修改的 int* const p: 表示p是指向int类型的const指针即指针p本身不能被修改但是指针p所指向的内存空间的值可以被修改 6.4 使用场景
6.4.1 做参数 作用a. 输出型参数 b. 提高效率 6.4.2 做返回值 传值返回是创建一个临时变量返回 传引用返回是直接返回引用 作用a. 少创建一个临时变量提高效率 b. ... 在上面的代码中为什么返回值要用static修饰呢我们可以先看几段代码 这段代码是正常的 若加上static 总结一个函数要使用引用返回返回变量出了这个函数的作用域还存在就可以使用引用返回否则就不安全即全局变量、静态变量等 6.4.3 引用做参数和做返回值提高效率对比
a.引用做参数 b. 引用做返回值 6.4.4 引用和指针的区别
在语法概念上引用就是一个别名没有独立空间和其引用的实体共用同一块空间在底层实现上实际是有空间的因为引用是按照指针的方式来实现的
可以看一下反汇编 引用与指针的不同点
1. 引用概念上定义一个变量的别名指针存储一个变量地址。 2. 引用在定义时必须初始化指针没有要求 3. 引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何 一个同类型实体 4. 没有NULL引用但有NULL指针 5. 在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节) 6. 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小 7. 有多级指针但是没有多级引用 8. 访问实体方式不同指针需要显式解引用引用编译器自己处理 9. 引用比指针使用起来相对更安全
7、内联函数
7.1 概念
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率。 7.2 特性
1、inline是一种以空间换时间的做法省去了调用函数的开销。所以代码很长(一般20行以内)或有循环或递归的函数不适宜使用内联函数
2、inline对于编译器而言只是一个建议编译器会自动优化如果定义为inline的函数内有循环递归等编译器优化时会自动忽略内联
3、inline不建议声明和定义分离分离会导致链接错误因为inline展开就没有函数地址了链接时就会找不到。
【面试题】 宏的优缺点 优点 1.增强代码的复用性。 2.提高性能。 缺点 1.不方便调试宏。因为预编译阶段进行了替换 2.导致代码可读性差可维护性差容易误用。 3.没有类型安全的检查 。 C有哪些技术替代宏 1. 常量定义 换用const enum 2. 短小函数定义 换用内联函数
8、auto关键字(C11)
8.1 auto简介
C11中auto作为一个新的类型指示符来指示编译器auto声明的变量必须是编译器在编译时推导而得 注意使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。 8.2 auto的使用规则 a. auto与指针和引用结合起来使用
用auto声明指针类型时用auto和auto*没有任何区别但auto声明引用类型时必须加
b.在同一行定义多个变量
当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译 器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。
8.3 auto不能推导的情景
a.auto不能做函数的参数 b. auto不能直接用来声明数组 c. 为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法
d. auto在实际中最常见的优势用法就是跟以后会讲到的C11提供的新式for循环还有 lambda表达式等进行配合使用。
9、基于范围的for循环(C11)
9.1 范围for的语法
对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因 此C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范 围内用于迭代的变量第二部分则表示被迭代的范围。
此时是不正确的因为第一个for里面的e是数组中元素的拷贝若要实现将数组中每个值都翻倍因为要让e变成数组中元素的引用 与普通循环类似可以使用continue来结束本次循环也可以使用break来跳出整个循环
9.2 范围for的使用条件
a. for循环迭代的范围必须是确定的
对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供 begin和end的方法begin和end就是for循环迭代的范围。
b. 范围for只能从头到尾遍历
c. 迭代对象要实现和的操作
10、指针空值nullptr(C11) a.在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入 的 b. 在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 c. 为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr