ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【C++】C++ 基础核心知识点梳理

2026/9/29 5:51:02 拓冰建站 浏览量
【C++】C++ 基础核心知识点梳理 C基础如果你想从C语言直接上手C建议你点➡️这里⬅️里面更直接易懂文章目录C基础1. 命名空间namespace1.1 c作用域1.2 命名空间1.3 域作用限定符::1.3.1 命名空间中结构体的访问1.4 展开命名空间using namespace xxx全部展开部分展开2.C输入输出2.1 cin和cout2.2 提高cincout的方式3.函数的缺省参数4.函数重载4.1创造条件⬇️❌错误示例✅正确示例⬇️4.2调用的歧义5.引用5.1符号和取地址符号相同5.2 使用5.3 不能使用的情况5.3const 引用5.3.1 对const变量引用5.3.2 对常量const引用5.4 指针和引用的关系6.内联inline7.nullptr1. 命名空间namespace1.1 c作用域不同作用域的同名变量不会冲突。局部域c中一样全局域c中一样命名空间域——只能在全局定义**命名空间域和类域不影响变量生命周期。**相当于全局变量不会被销毁啥的。不过要用域作用限定符::使用类域1.2 命名空间结尾没有分号和结构体不一样可以嵌套不同文件的同名命名空间会合并1.3 域作用限定符::前面啥都不写代表访问全局变量前面写上namespace的名字就是访问对应命名空间中的变量命名空间中有结构体访问比较特殊C 语言必须写structC可写可不写inta0;intmain(){inta1;printf(局部a: %d\n,a);// 输出1优先用局部的printf(全局a: %d\n,::a);// 输出0用::强制访问全局的return0;}1.3.1 命名空间中结构体的访问namespaceLcj{structNode{intval;intsize;};}intmain(){structLcj::Nodenode1{1,2};Lcj::Node node2{7,8};printf(%d\n,node2.size);printf(%d\n,node1.size);return0;}1.4 展开命名空间using namespace xxx全部展开using namespace std;——意思里面所有东西全都不用写::展开后再用“::”也不算错项目不推荐日常练习可以部分展开using LCJ::a✅ 意思只用a不用写LCJ::a这个成员经常访问且不冲突❌ 其他成员比如 LCJ::b必须写::2.C输入输出2.1 cin和cout如果你想从直接上手C建议你点➡️这里⬅️里面更直接易懂头文件iostreamstd::cin如果前面有using namespace std就可以不用std::std::out如果前面有using namespace std就可以不用std::C的输入输出可以自动识别变量类型甚至\n和“\n”都能够识别为换行符控制小数点精度最好用原来的printf(“%.3f”,d);2.2 提高cincout的方式// 加上以下3⾏代码// 可以提⾼CIO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);3.函数的缺省参数——人家有人我就不出现没人我再出现原来C语言中的函数应该写成这样void Func1(int a, int b , int c )c中的参数可以写成这样全缺省void Func2(int a 20, int b 10, int c 20)//半缺省void Func2(int a, int b 10, int c 20)//作用➡️使用函数如果不传参就用里面的缺省值‼️注意点半缺省只能前无赋值后赋值顺序不能变。传参不能跳跃传缺省参数在声明.h和定义.c中不能同时出现。如果只有一个.c文件那就在.c中写如果有声明.h和定义.c就在声明.h中写4.函数重载C语言不支持同名函数C支持同名函数——函数重载同一作用域 和 不同作用域都可以出现同名函数前者叫叫做函数重载后者通过域作用限定符::分辨4.1创造条件以下原因有一个就行参数不同参数类型不同参数顺序不同其实就是类型不同返回值不能作为重载条件无法区分⬇️❌错误示例iteratorbegin(){return_start;}iteratorend(){return_finish;}constiteratorbegin(){return_start;}constiteratorend(){return_finish;}✅正确示例⬇️为什么要专门新建一个const迭代器const_iterator呢**原因**const 对象就是代表“只读不修改”如果返回普通迭代器就可以修改内容typedefT*iterator;typedefconstT*const_iterator;iteratorbegin(){return_start;}iteratorend(){return_finish;}const_iteratorbegin()const{return_start;}// 返回 const 指针const_iteratorend()const{return_finish;}4.2调用的歧义void f1( )void f1(int a 10)二者看似都能通过不传参调用但是会有问题调用是不被允许的如果不得不用可以放到不同的域中不过这就不是函数重载了同一作用域 才是5.引用不是新定义⼀个变量 是给原变量取了⼀个别名引用不能指向空值——引用在定义时必须初始化且必须绑定到一个已存在的有效对象5.1符号和取地址符号相同放在类型后面就是取地址放在变量前面就是取地址5.2 使用在创建引用变量时必须初始化不能只是创建个:int a;可以对引用再次引用就是取别名而已本质相当于引用再解引用——以后就不需要传指针了直接引用就行引用后不能再引用其他实体只能赋值调用函数引用的定义在形参列表里(int * tmp)调用时正常传变量。调用时写就是取地址的意思voidSwap(inta,intb){intta;ab;bt;}intmain(){intx1,y2;Swap(x,y);// 调用直接传变量名不加 }5.3 不能使用的情况返回局部变量的引用5.3const 引用5.3.1 对const变量引用✅const int a 10;的引用只能const int raa;❌const int a 10;——const int raa;权限放大✅const int a 10;——int da不是权限放大访问的不是同一块位置不是取别名只是拷贝赋值且int b10;——const int rbb;权限缩小权限可以缩小不能放大5.3.2 对常量const引用✅const int rc 100 ;❌int rc 100 ;✅const int rd(ab)(ab)的值在一个常性临时对象中//只是赋值而已❌int rd(ab)还是权限放大常量不能变成可修改的量同理​double x 3.3;​❌int ry x——类型转换时x的值在一个常性临时对象中。权限放大​✅const int ry x5.4 指针和引用的关系语法上引用是取别名不开空间指针开空间放地址初始化指针不必须引用必须初始化指向指针可改引用不可改访问指针要解引用引用直接访问sizeof指针始终是4字节32位引用取决于引用对象安全指针可能会出现野指针引用相对安全6.内联inline目的替代C的宏函数宏在编译的时候就发生替换实际上并没有宏这个东西在编译之后都替换成了对应的代码。inline 也是并没有真正的内联函数编译之后会变成内联函数中的一串串代码使用方法在函数前面加上inline作用编译时C编译器会在调用的地方展开内联函数这样调用内联函数就不需要建立栈帧了就可以提高效率。局限和适用性声明和定义必须在一个文件建议函数直接放在.h文件中 原因内联函数是在编译时直接展开代码但多文件拼在一起是链接阶段才做的事情编译和链接的过程.c, .h 文件——编译这时候虽然 .h 文件已经复制粘贴到 .c文件但是 各.c文件还看不到彼此所以不能在一个.c 中访问另一个.c 中的inline 函数——链接——可执行程序对于编译器而言只是⼀个建议—— 加了inline编译器也可能不展开不同编译器关于inline什么情况展开各不相同因为C标准没有规定这个。vs的debug默认不展开inline适用于频繁调用的短小函数对于递归函数代码相对多⼀些的函数加上inline也会被编译器忽略。怕太长出错。‼️注意不同源文件.cpp里写同名但实现不同的 inline 函数不会冲突。原因inline 函数在编译时就被直接展开成代码不会生成全局符号链接器看不到它所以不同源文件里的同名 inline 函数不会冲突。7.nullptr为什么有这个C中NULL可能被定义为字面常量0C专门定义了一个专门的空指针nullptr不会出错