从C语言到C++新手入门

发布时间:2026/7/22 9:55:06
从C语言到C++新手入门 从C语言到C新手入门C是C语言的超集绝大多数标准C代码可以直接放进C编译器编译运行。C没有推翻C的底层逻辑只是在过程式C的基础上补充现代语法、安全特性、标准库与完整面向对象体系。一、C与C完全通用的内容你的C基础全部有效1. 基础数据类型、运算符体系完全一致相同说明char、short、int、long、long long、float、double、unsigned 全通用算术、逻辑、位运算、指针/*、三目运算符优先级、写法完全一样。案例// C代码inta10,b3;intresab*2;intflagabb!0;int*pa;// 完全相同直接复制运行inta10,b3;intresab*2;intflagabb!0;int*pa;2. 流程控制语句无任何区别相同说明if-else、for、while、do-while、switch、break、continue、goto 语法完全一致0为假非0为真的判断规则不变。案例// Cintnum5;if(num0){for(inti0;inum;i){if(i2)break;}}// C 完全复用intnum5;if(num0){for(inti0;inum;i){if(i2)break;}}3. 指针、数组、内存底层逻辑互通相同说明数组首地址、一级/二级指针、函数指针、栈/堆/全局区概念不变malloc/free、char[]字符串、\0结束符全部兼容。案例// C 指针堆内存intarr[4]{1,2,3,4};int*parr;int*heap(int*)malloc(sizeof(int)*2);heap[0]99;free(heap);// C 原样运行无报错intarr[4]{1,2,3,4};int*parr;int*heap(int*)malloc(sizeof(int)*2);heap[0]99;free(heap);4. 基础函数、结构体基础用法兼容相同说明普通函数声明、递归、传值/传地址通用struct 定义、.、-访问成员语法不变。案例// CstructPerson{intage;};voidprintAge(structPersonp){printf(%d,p.age);}// C 直接使用structPerson{intage;};voidprintAge(structPersonp){printf(%d,p.age);}5. 预处理、注释、文件IO通用相同说明#include、#define、//单行、/* */多行注释fopen/fprintf/fclose文件操作全部支持。案例// C#defineMAX100// 打开文件写入FILE*fpfopen(test.txt,w);fprintf(fp,hello);fclose(fp);// C 完全兼容#defineMAX100FILE*fpfopen(test.txt,w);fprintf(fp,hello);fclose(fp);二、语法层面C与C详细区别1. 变量定义位置限制不同区别说明C89变量必须写在代码块最顶部C任意位置定义变量循环、判断内部都能新建变量。// C89 合法写法voidtest(){inta;a10;intb;// 必须放开头写在a10后面编译报错}// C 自由定义voidtest(){inta10;if(a0){intb20;// 分支内定义变量}for(inti0;i5;i){}}2. C独有bool原生布尔类型区别说明C无bool只能用int模拟真假C内置bool、true、false关键字。// C 模拟布尔intisOk1;if(isOk){}// C 原生布尔boolisOktrue;if(isOk){}3. const关键字行为差异区别说明C const只是只读变量指针可篡改C const为编译期常量编译器保护可做数组长度。// C 漏洞constintn10;int*pn;*p100;// 正常编译常量被修改intarr[n];// C标准报错// C 强约束constintn10;int*pn;// 编译直接报错intarr[n];// 合法4. 函数重载、默认参数C不支持区别说明C同一域函数名唯一C支持同名不同参重载还能设置参数默认值。// C 不允许两个print函数直接重定义报错voidprint(intx){}voidprint(doublex){}// C 合法重载默认参数voidprint(intx){coutx;}voidprint(doublex){coutx;}voidshow(inta,intb5){}5. 命名空间 namespaceC不存在区别说明C所有全局变量/函数挤在同一全局域极易重名冲突C namespace隔离代码标准库统一在std。// C 两个全局函数同名直接报错voidfunc(){}voidfunc(){}// C 命名空间隔离不会冲突namespaceA{voidfunc(){}}namespaceB{voidfunc(){}}A::func();B::func();// 标准库简写usingnamespacestd;cout123;6. 新增引用 C无区别说明C只有指针C引用是变量别名不用取地址、*解引用简化传参。// C 交换只能用指针voidswap(int*x,int*y){intt*x;*x*y;*yt;}// C 引用交换更简洁voidswap(intx,inty){inttx;xy;yt;}inta1,b2;swap(a,b);7. struct结构体行为差异区别说明C struct仅存变量不能写函数使用必须带structC struct可写成员函数默认public可省略struct关键字。// CstructStudent{intid;};structStudents;// 必须写structvoidshow(structStudents){printf(%d,s.id);}// C struct内置函数structStudent{intid;voidshow(){coutid;}};Student s;// 省略struct关键字s.id1001;s.show();三、输入输出printf/scanf vs cin/cout相同点C IO 在C中完全兼容都能输入输出数字、字符、字符串都支持控制台交互。相同案例// C中混用C IO完全没问题#includestdio.hinta;scanf(%d,a);printf(数字%d,a);核心区别C依赖格式符%d/%f输入必须加头文件stdio.hC流自动识别类型无需占位符不用取地址头文件iostream属于std// C IO#includestdio.hinta;scanf(%d,a);printf(数值%d\n,a);// C cin/cout#includeiostreamusingnamespacestd;inta;cina;cout数值aendl;四、动态内存malloc/free vs new/delete相同点都在堆区分配内存必须手动释放否则内存泄漏Cmalloc/free可在C代码直接调用。相同案例#includecstdlibint*p(int*)malloc(sizeof(int));*p66;free(p);区别malloc返回void*需要强转new自带类型无需转换new自动调用构造函数delete调用析构malloc仅分配裸内存数组分配必须配套delete[]malloc统一free// C mallocint*arr(int*)malloc(5*sizeof(int));arr[0]1;free(arr);// C new/deleteint*arrnewint[5];arr[0]1;delete[]arr;int*numnewint(10);deletenum;硬性规则malloc搭配freenew搭配delete禁止混用。五、标准库对比C库 vs C STL相同点C全部标准库可在C使用都提供字符串、数学、时间、文件工具相同案例#includecstringcharstr[20]hello;strcat(str, c);// C字符串函数正常使用详细区别1. 头文件格式C.h后缀string.h、stdio.hC无.hstring、vector、algorithm2. 字符串处理// C char数组手动管理\0#includestring.hchars[20]hi;strcat(s, c);printf(%d,strlen(s));// C std::string自动管理内存#includestringstring shi;s c;couts.size();3. 动态容器C无C只能malloc手动扩容C vector动态数组自动管理内存// C 变长数组需要手动扩容繁琐int*vec(int*)malloc(3*sizeof(int));// C vector#includevectorvectorintvec;vec.push_back(1);vec.push_back(2);4. 内置算法C需要手写排序C algorithm自带sortvectorintv{3,1,2};sort(v.begin(),v.end());六、核心分水岭C struct vs C class 面向对象相同点都能存储一组自定义数据.访问变量、-指针访问语法通用。相同案例structStu{intid;};structStus;s.id10;structStu*ps;p-id20;structStu{intid;};Stu s;s.id10;Stu*ps;p-id20;巨大差异C struct 只有变量无成员函数C class 数据行为绑定C无访问权限C public/private/protected 控制外部访问C无构造、析构、继承、多态C完整支持面向对象三大特性// C函数只能写在结构体外部structStudent{intid;charname[20];};voidprint(structStudents){printf(%d %s,s.id,s.name);}// C class 封装数据与方法#includeiostream#includestringusingnamespacestd;classStudent{private:intid;string name;public:voidset(inti,string n){idi;namen;}voidshow(){coutid nameendl;}};intmain(){Student s;s.set(1001,小明);s.show();return0;}七、其他补充差异点1. 模板 templateC无泛型区别C通用工具只能用void*强转重复代码C模板一套代码适配多类型// C 泛型函数模板templatetypenameTTadd(T a,T b){returnab;}add(1,2);add(1.5,2.5);2. 异常处理 try-catchC无区别C靠返回值判断错误C结构化捕获异常try{inta10,b0;if(b0)throw除数不能为0;}catch(constchar*err){couterr;}3. C推荐用const/inline替代宏区别C大量#define宏无类型检查C const常量、inline函数更安全// C 宏#defineMAX100#defineADD(a,b)ab// C 替代方案constintMAX100;inlineintadd(inta,intb){returnab;}八、总结一、完全通用、直接复用不用重学基础类型、运算符、循环分支、指针数组、基础函数、C标准库、文件操作、struct基础、内存分区逻辑全部可以直接迁移到C。二、C新增/改良需要重点学习语法自由定义变量、bool、const强化、引用、namespace、函数重载/默认参数、新式强制转换IOcin/cout 流输入输出内存new/delete 替代malloc/free标准库string、vector、STL容器与算法面向对象class、封装、继承、多态、构造/析构、this指针高级特性模板、try-catch异常、inline替代宏学习路线建议过渡期可以混用C代码熟悉后逐步替换C特性指针是两门语言共用核心吃透指针才能学好STL与类严格区分两套IO、两套内存分配API不要交叉混用学习重心放在class与STL这是C对比C最大优势。c语言到c是不同类型的编程语言是从面向过程到面向对象的进步简单来说越“高级”的语言我们的编程就越容易当然随着我们解决问题的逻辑改变我们的思考方式也要有所转变从用函数function为基本单元解决问题到以对象object为单元解决问题这是才是我们学习的核心。