C++ 入门基础复习:从 C 到 C++ 的关键变化一次搞懂

发布时间:2026/10/3 13:03:43
C++ 入门基础复习:从 C 到 C++ 的关键变化一次搞懂
C 入门基础复习从 C 到 C 的关键变化一次搞懂本篇根据你提供的01.C入门基础.pdf整理目标不是重新学习而是帮助你把以前学过的知识快速重新串起来按照你的要求计算机历史相关内容不整理并且全文去掉中文句号。文章目录C 入门基础复习从 C 到 C 的关键变化一次搞懂一、C 和 C 的关系二、命名空间 namespace为什么需要命名空间三、namespace 的基本使用四、std 命名空间五、using namespace std六、C 输入输出coutcin七、cin 和 scanf 的区别八、C 输入输出效率九、缺省参数十、缺省参数的本质十一、全缺省参数十二、半缺省参数十三、缺省参数的重要规则规则一规则二十四、函数重载十五、什么条件能够构成函数重载十六、返回值不同不能构成函数重载十七、引用十八、引用的特点十九、引用必须初始化二十、引用不是重新创建一个变量二十一、引用和指针的关系二十二、引用作为函数参数二十三、引用为什么适合做参数二十四、const 引用二十五、const 引用可以引用普通变量二十六、const 引用可以引用临时对象二十七、为什么函数参数经常使用 const 引用第一第二二十八、临时对象二十九、这一篇需要重点回忆什么三十、复习时最容易混淆的几个地方1 赋值和引用不要混淆2 指针和引用不要混淆3 const int* 和 const int 不要混淆三十一、这一篇的最终记忆框架一、C 和 C 的关系学习 C 时首先要明确一个概念C 并不是完全推翻 C 重新设计的一门语言它是在 C 语言基础上不断扩展形成的语言所以你之前学过的很多 C 语言知识在 C 中依然存在例如inta10;doubleb3.14;charca;if(a0){printf(hello\n);}for(inti0;i10;i){printf(%d\n,i);}这些基础语法依然可以使用C 真正新增和强化的部分主要体现在命名空间 输入输出流 函数重载 缺省参数 引用 面向对象 类和对象 封装 继承 多态 模板 STL因此学习 C 的时候不应该把它理解成C 语言完全没用了而应该理解成C 在 C 语言基础上增加了大量更强大的语言机制二、命名空间 namespace这是 C 入门阶段非常重要的知识为什么需要命名空间假设我们写了两个函数voidTest(){printf(Test1\n);}voidTest(){printf(Test2\n);}这样直接编译会产生问题因为同一个作用域中不能存在两个完全相同的函数现实开发中不同的人编写不同模块时很容易出现名字冲突例如张三的代码intrand;李四的代码intrand;如果最后把两个模块放到一起就可能产生命名冲突命名空间就是用来解决这个问题的三、namespace 的基本使用可以把不同的代码放到不同的命名空间里面namespaceZhangSan{inta10;}namespaceLiSi{inta20;}此时虽然两个变量都叫a但是它们属于不同的命名空间使用的时候可以通过ZhangSan::a和LiSi::a进行区分这里的::叫做作用域解析运算符四、std 命名空间C 标准库中的大量内容都放在std命名空间里面例如std::cout std::cin std::endl std::string std::vector所以最标准的写法是#includeiostreamintmain(){std::couthellostd::endl;return0;}这里std::就表示从std命名空间中寻找对应的内容五、using namespace std为了避免每次都写std::可以使用usingnamespacestd;例如#includeiostreamusingnamespacestd;intmain(){couthelloendl;return0;}这样就可以直接使用cout cin endl而不用写std::cout std::cin std::endl日常练习中可以使用using namespace std实际项目开发中不建议直接使用它原因主要是如果命名空间中的名字非常多全部展开以后可能再次造成命名冲突因此实际项目中更常见std::cout std::vectorintstd::string这种写法六、C 输入输出C 中最常见的输入输出方式是cin cout需要包含#includeiostreamcout例如inta10;doubleb3.14;charca;coutaendl;coutbendl;coutcendl;也可以连续输出couta b cendl;这里叫做流插入运算符可以简单理解为把右边的数据交给 cout 输出cinC 输入使用cin变量;例如inta;doubleb;charc;cina;cinb;cinc;也可以连续输入cinabc;这里叫做流提取运算符可以简单理解成从 cin 中提取数据七、cin 和 scanf 的区别C 语言中通常写inta;doubleb;scanf(%d%lf,a,b);C 中可以写inta;doubleb;cinab;最大的区别之一就是C 的流输入能够根据变量类型自动处理不需要自己写%d%lf%c这样的格式控制符C 输入输出本质上涉及函数重载以及后续面向对象相关知识所以这里先理解使用方式即可八、C 输入输出效率如果只是普通练习cin cout直接使用即可在大量输入输出的场景中可以使用ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);例如#includeiostreamusingnamespacestd;intmain(){ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return0;}这主要用于提高 C IO 的效率在 IO 需求比较高的地方例如部分大量输入的竞赛题中可以加入这些代码九、缺省参数缺省参数是 C 对函数参数进行扩展的重要特性例如voidFunc(inta10){coutaendl;}调用Func();相当于使用Func(10);也可以主动传参数Func(20);此时使用的就是20而不是默认值10十、缺省参数的本质例如voidTest(inta10){coutaendl;}调用Test();因为没有给a提供实参所以使用默认值10调用Test(100);因为提供了实参所以使用100所以可以记成没有传参数 → 使用默认值 传了参数 → 使用传入的值十一、全缺省参数例如voidTest(inta10,intb20,intc30){couta ;coutb ;coutcendl;}那么下面几种调用都可以Test();相当于Test(10,20,30);Test(100);相当于Test(100,20,30);Test(100,200);相当于Test(100,200,30);Test(100,200,300);相当于Test(100,200,300);十二、半缺省参数例如voidTest(inta,intb20,intc30){}这里a没有默认值而b c有默认值所以调用Test(10);是合法的相当于Test(10,20,30);但是Test();不合法因为a没有默认值十三、缺省参数的重要规则需要重点记住规则一缺省参数一般从右往左连续提供正确voidTest(inta,intb10,intc20);不应该写成voidTest(inta10,intb,intc20);因为中间出现了没有默认值的参数规则二函数声明和定义中不能重复给默认值例如voidTest(inta10);定义时voidTest(inta){}这样即可不要写成voidTest(inta10){}十四、函数重载函数重载也是 C 非常重要的特性例如intAdd(inta,intb){returnab;}doubleAdd(doublea,doubleb){returnab;}虽然两个函数名字都叫Add但是参数不同因此可以同时存在调用Add(1,2);会匹配intAdd(int,int)调用Add(1.1,2.2);会匹配doubleAdd(double,double)十五、什么条件能够构成函数重载函数重载要求函数名相同参数列表不同参数列表不同可以表现为参数个数不同 参数类型不同 参数顺序不同例如voidTest(inta);voidTest(inta,intb);可以重载voidTest(inta);voidTest(doublea);也可以重载voidTest(inta,doubleb);voidTest(doublea,intb);也可以重载十六、返回值不同不能构成函数重载下面这种情况不行intTest(){return1;}doubleTest(){return1.0;}因为两个函数Test()参数列表完全一样仅仅返回值不同不能构成重载所以记住不能只靠返回值区分函数重载十七、引用引用是 C 非常核心的一个知识点基本语法inta10;intraa;这里ra是a的别名可以理解成a 是一个变量 ra 是 a 的另一个名字十八、引用的特点例如inta10;intraa;ra20;此时coutaendl;结果是20因为ra和a实际上指向同一个对象十九、引用必须初始化例如inta10;intraa;正确但是不能写intra;引用在定义的时候必须初始化也就是说必须明确ra 是谁的别名二十、引用不是重新创建一个变量例如inta10;intraa;不要把它理解成又创建了一个 int 类型变量 ra更准确的理解是ra 是 a 的别名引用是一个变量的取别名而指针是存储一个变量地址二十一、引用和指针的关系这部分非常重要可以先从概念上区分对比指针引用本质存储地址变量别名是否需要初始化语法上不强制必须初始化是否可以为空可以有nullptr通常不应该理解成空引用使用方式*p直接使用是否可以修改指向可以初始化后不能改绑是否开空间指针本身需要空间语言层面不把引用理解为独立对象指针和引用虽然存在功能重叠但二者并不能完全互相替代二十二、引用作为函数参数这是引用最常见的用途之一例如交换两个变量C 语言中通常使用指针voidSwap(int*px,int*py){inttmp*px;*px*py;*pytmp;}调用inta10;intb20;Swap(a,b);C 可以使用引用voidSwap(intx,inty){inttmpx;xy;ytmp;}调用Swap(a,b);这样就不需要显式写*二十三、引用为什么适合做参数假设voidFunc(intx){}传参的时候会产生一份值拷贝而voidFunc(intx){}这里x是原变量的别名因此可以直接操作原变量例如voidAdd(intx){x;}inta10;Add(a);执行之后a11二十四、const 引用这一部分是引用中非常容易考的知识例如constinta10;此时不能用普通引用intraa;因为这样相当于把一个不能修改的对象变成了可以通过 ra 修改的对象这属于权限放大因此应该写constintraa;二十五、const 引用可以引用普通变量例如inta10;constintraa;这是可以的但是此时不能通过ra修改a// ra;不允许但是a;依然可以因为真正的变量a本身不是 const只是ra这个访问入口具有只读权限二十六、const 引用可以引用临时对象例如constintra10;这是合法的还可以inta10;constintrba*3;这里a*3产生的是一个临时结果C 可以让const引用绑定到这个临时对象二十七、为什么函数参数经常使用 const 引用例如voidPrint(conststrings){coutsendl;}这样做同时解决了两个问题第一避免大对象进行拷贝第二保证函数不会修改传入对象所以以后看到constT经常可以理解成不想拷贝 不允许修改这是 C 中非常常见的一种函数参数写法二十八、临时对象什么叫临时对象例如inta10;a3;表达式a3会产生一个计算结果这个结果并没有一个我们明确命名的变量C 会在需要的时候创建一个临时对象保存这个结果例如constintrba*3;rb可以引用这个临时对象二十九、这一篇需要重点回忆什么如果你以前已经学过这些内容现在复习的时候不需要重新死记全部细节建议重点重新建立下面这条知识链C ↓ namespace ↓ std 命名空间 ↓ cin / cout ↓ 缺省参数 ↓ 函数重载 ↓ 引用 ↓ const 引用 ↓ 临时对象 ↓ 指针和引用的区别其中真正需要重点掌握的是namespace 为什么存在 :: using namespace std 的作用 cin / cout 的基本使用 缺省参数规则 函数重载的判断条件 为什么返回值不同不能构成重载 引用是什么 引用为什么必须初始化 引用和指针有什么区别 const 引用为什么可以绑定临时对象三十、复习时最容易混淆的几个地方1 赋值和引用不要混淆inta10;intba;这里是拷贝a 10 b 10两个变量是独立的而inta10;intba;这里是引用b 是 a 的别名2 指针和引用不要混淆inta10;int*pa;intra;使用指针*p20;使用引用r20;最终都会修改a但二者的语言概念完全不同3 const int* 和 const int 不要混淆指针constint*p;重点是不能通过 p 修改它指向的对象引用constintra;重点是不能通过 r 修改对象三十一、这一篇的最终记忆框架以后重新看到 C 入门基础的时候可以直接在脑子里回忆成下面这个框架C 基础 │ ├── 命名空间 │ ├── namespace │ ├── 作用域解析运算符 :: │ ├── std │ └── using namespace std │ ├── 输入输出 │ ├── cin │ ├── cout │ ├── endl │ └── IO 效率 │ ├── 函数增强 │ ├── 缺省参数 │ └── 函数重载 │ └── 引用 ├── 基本概念 ├── 引用初始化 ├── 引用作为参数 ├── const 引用 ├── 临时对象 └── 指针和引用的区别这一部分复习完之后真正需要做到的不是能够背出定义而是看到代码能够马上判断inta10;intba;知道b是a的别名看到constintba;知道b只能读不能通过它修改a看到voidTest(inta10);知道这是缺省参数看到voidTest(int);voidTest(double);知道这是函数重载看到std::cout知道cout属于std命名空间看到constintra10;知道这里涉及临时对象和常引用绑定这些才是复习阶段最重要的内容