☰
【C++】C++ 基础核心知识点梳理
2026/9/29 5:50:58 网站建设 项目流程

C++基础

如果你想从C语言直接上手C++,建议你点➡️这里⬅️,里面更直接易懂

文章目录

  • C++基础
  • 1. 命名空间namespace
    • 1.1 c++作用域:
    • 1.2 命名空间
    • 1.3 域作用限定符::
      • 1.3.1 命名空间中结构体的访问
    • 1.4 展开命名空间:using namespace xxx
      • 全部展开
      • 部分展开
  • 2.C++输入输出
    • 2.1 cin和cout
    • 2.2 提高cin,cout的方式
  • 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.内联inline
  • 7.nullptr

1. 命名空间namespace




1.1 c++作用域:

不同作用域的同名变量,不会冲突。

  1. 局部域,(c中一样)
  2. 全局域,(c中一样)
  3. 命名空间域,——只能在全局定义**,命名空间域和类域不影响变量生命周期。**(相当于全局变量,不会被销毁啥的。不过要用域作用限定符::使用)
  4. 类域



1.2 命名空间

  1. 结尾没有分号(和结构体不一样)
  2. 可以嵌套
  3. 不同文件的同名命名空间会合并



1.3 域作用限定符::

  1. 前面啥都不写代表访问全局变量
  2. 前面写上namespace的名字就是访问对应命名空间中的变量
  3. 命名空间中有结构体,访问比较特殊(C 语言必须写struct,C++可写可不写)
inta=0;intmain(){inta=1;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++,建议你点➡️这里⬅️,里面更直接易懂

  • 头文件:<iostream>

  • std::cin(如果前面有using namespace std就可以不用std::)

  • std::out(如果前面有using namespace std就可以不用std::)

  • C++的输入输出可以自动识别变量类型

    • 甚至'\n'和“\n”都能够识别为换行符
  • 控制小数点精度,最好用原来的printf(“%.3f”,d);

2.2 提高cin,cout的方式

// 加上以下3⾏代码// 可以提⾼C++IO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);





3.函数的缺省参数

——人家有人我就不出现,没人我再出现

原来C语言中的函数应该写成这样:void Func1(int a, int b , int c )

c++中的参数可以写成这样:

  1. 全缺省:void Func2(int a = 20, int b = 10, int c = 20)//
  2. 半缺省:void Func2(int a, int b = 10, int c = 20)//

作用➡️使用函数如果不传参,就用里面的缺省值

‼️注意点:

  1. 半缺省只能前无赋值后赋值,顺序不能变。
  2. 传参不能跳跃传
  3. 缺省参数在声明(.h)和定义(.c)中不能同时出现。
    1. 如果只有一个.c文件,那就在.c中写,
    2. 如果有声明(.h)和定义(.c),就在声明(.h)中写





4.函数重载

  • C语言不支持同名函数
  • C++支持同名函数——函数重载

同一作用域 和 不同作用域都可以出现同名函数

  1. 前者叫叫做函数重载
  2. 后者通过域作用限定符::分辨

4.1创造条件

以下原因有一个就行

  1. 参数不同
  2. 参数类型不同
  3. 参数顺序不同(其实就是类型不同)

返回值不能作为重载条件,无法区分

⬇️❌错误示例

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调用的歧义

  1. void f1( )
  2. void f1(int a = 10)

二者看似都能通过不传参调用,但是会有问题,调用是不被允许的

如果不得不用,可以放到不同的域中,(不过这就不是函数重载了,同一作用域 才是)






5.引用&

不是新定义⼀个变量, 是给原变量取了⼀个别名

引用不能指向空值——引用在定义时必须初始化,且必须绑定到一个已存在的有效对象

5.1符号:&(和取地址符号相同)

  1. 放在类型后面就是取地址
  2. 放在变量前面就是取地址

5.2 使用

  1. 在创建引用变量时,必须初始化,不能只是创建个:int& a;
  2. 可以对引用再次引用(就是取别名而已)
  3. 本质相当于引用再解引用——以后就不需要传指针了,直接引用就行
  4. 引用后,不能再引用其他实体,只能赋值
  5. 调用函数:
    • 引用的定义在形参列表里(int * tmp),调用时正常传变量。(调用时写&就是取地址的意思)
voidSwap(int&a,int&b){intt=a;a=b;b=t;}intmain(){intx=1,y=2;Swap(x,y);// 调用:直接传变量名,不加 &}

5.3 不能使用的情况

  • 返回局部变量的引用

5.3const 引用

5.3.1 对const变量引用

✅const int a= 10;的引用只能const int& ra=a;

❌const int a= 10;——>const int& ra=a;,权限放大

✅const int a= 10;——>int d=a`不是权限放大,访问的不是同一块位置,不是取别名,只是拷贝赋值

且int b=10;——>const int& rb=b;🉑,权限缩小

权限可以缩小,不能放大

5.3.2 对常量const引用

  1. ✅const int& rc= 100 ;

    ❌int& rc= 100 ;

  2. ✅const int & rd=(a+b),(a+b)的值在一个常性临时对象中,//只是赋值而已

    ❌int & rd=(a+b),还是权限放大,常量不能变成可修改的量

    同理:

    ​double x =3.3;

    ​❌int & ry= x——>类型转换时,x的值在一个常性临时对象中。权限放大

    ​✅const int & ry= x

5.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可能被定义为字面常量0

C++专门定义了一个专门的空指针nullptr,不会出错






需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询