从C语言到C++新手入门
2026/7/22 9:54:45 网站建设 项目流程

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

C++是C语言的超集,绝大多数标准C代码可以直接放进C++编译器编译运行。C++没有推翻C的底层逻辑,只是在过程式C的基础上,补充现代语法、安全特性、标准库与完整面向对象体系。

一、C与C++完全通用的内容(你的C基础全部有效)

1. 基础数据类型、运算符体系完全一致

相同说明

char、short、int、long、long long、float、double、unsigned 全通用;算术、逻辑、位运算、指针&/*、三目运算符优先级、写法完全一样。

案例
// C代码inta=10,b=3;intres=a+b*2;intflag=a>b&&b!=0;int*p=&a;
// 完全相同,直接复制运行inta=10,b=3;intres=a+b*2;intflag=a>b&&b!=0;int*p=&a;

2. 流程控制语句无任何区别

相同说明

if-else、for、while、do-while、switch、break、continue、goto 语法完全一致;0为假,非0为真的判断规则不变。

案例
// Cintnum=5;if(num>0){for(inti=0;i<num;i++){if(i==2)break;}}
// C++ 完全复用intnum=5;if(num>0){for(inti=0;i<num;i++){if(i==2)break;}}

3. 指针、数组、内存底层逻辑互通

相同说明

数组=首地址、一级/二级指针、函数指针、栈/堆/全局区概念不变;malloc/freechar[]字符串、\0结束符全部兼容。

案例
// C 指针+堆内存intarr[4]={1,2,3,4};int*p=arr;int*heap=(int*)malloc(sizeof(int)*2);heap[0]=99;free(heap);
// C++ 原样运行无报错intarr[4]={1,2,3,4};int*p=arr;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*fp=fopen("test.txt","w");fprintf(fp,"hello");fclose(fp);
// C++ 完全兼容#defineMAX100FILE*fp=fopen("test.txt","w");fprintf(fp,"hello");fclose(fp);

二、语法层面:C与C++详细区别

1. 变量定义位置限制不同

区别说明

C89:变量必须写在代码块最顶部;C++任意位置定义变量,循环、判断内部都能新建变量。

// C89 合法写法voidtest(){inta;a=10;intb;// 必须放开头,写在a=10后面编译报错}
// C++ 自由定义voidtest(){inta=10;if(a>0){intb=20;// 分支内定义变量}for(inti=0;i<5;i++){}}

2. C++独有bool原生布尔类型

区别说明

C无bool,只能用int模拟真假;C++内置booltruefalse关键字。

// C 模拟布尔intisOk=1;if(isOk){}
// C++ 原生布尔boolisOk=true;if(isOk){}

3. const关键字行为差异

区别说明

C const只是只读变量,指针可篡改;C++ const为编译期常量,编译器保护,可做数组长度。

// C 漏洞constintn=10;int*p=&n;*p=100;// 正常编译,常量被修改intarr[n];// C标准报错
// C++ 强约束constintn=10;int*p=&n;// 编译直接报错intarr[n];// 合法

4. 函数:重载、默认参数(C不支持)

区别说明

C同一域函数名唯一;C++支持同名不同参重载,还能设置参数默认值。

// C 不允许两个print函数,直接重定义报错voidprint(intx){}voidprint(doublex){}
// C++ 合法重载+默认参数voidprint(intx){cout<<x;}voidprint(doublex){cout<<x;}voidshow(inta,intb=5){}

5. 命名空间 namespace(C不存在)

区别说明

C所有全局变量/函数挤在同一全局域,极易重名冲突;C++ namespace隔离代码,标准库统一在std。

// C 两个全局函数同名直接报错voidfunc(){}voidfunc(){}
// C++ 命名空间隔离,不会冲突namespaceA{voidfunc(){}}namespaceB{voidfunc(){}}A::func();B::func();// 标准库简写usingnamespacestd;cout<<123;

6. 新增引用 &(C无)

区别说明

C只有指针;C++引用是变量别名,不用&取地址、*解引用,简化传参。

// C 交换只能用指针voidswap(int*x,int*y){intt=*x;*x=*y;*y=t;}
// C++ 引用交换更简洁voidswap(int&x,int&y){intt=x;x=y;y=t;}inta=1,b=2;swap(a,b);

7. struct结构体行为差异

区别说明

C struct仅存变量,不能写函数,使用必须带struct;C++ struct可写成员函数,默认public,可省略struct关键字。

// CstructStudent{intid;};structStudents;// 必须写structvoidshow(structStudents){printf("%d",s.id);}
// C++ struct内置函数structStudent{intid;voidshow(){cout<<id;}};Student s;// 省略struct关键字s.id=1001;s.show();

三、输入输出:printf/scanf vs cin/cout

相同点

  1. C IO 在C++中完全兼容;
  2. 都能输入输出数字、字符、字符串;
  3. 都支持控制台交互。
相同案例
// C++中混用C IO完全没问题#include<stdio.h>inta;scanf("%d",&a);printf("数字:%d",a);

核心区别

  1. C:依赖格式符%d/%f,输入必须加&;头文件<stdio.h>
  2. C++流:自动识别类型,无需占位符,不用取地址;头文件<iostream>,属于std
// C IO#include<stdio.h>inta;scanf("%d",&a);printf("数值:%d\n",a);
// C++ cin/cout#include<iostream>usingnamespacestd;inta;cin>>a;cout<<"数值:"<<a<<endl;

四、动态内存:malloc/free vs new/delete

相同点

  1. 都在堆区分配内存,必须手动释放,否则内存泄漏;
  2. Cmalloc/free可在C++代码直接调用。
相同案例
#include<cstdlib>int*p=(int*)malloc(sizeof(int));*p=66;free(p);

区别

  1. malloc返回void*需要强转;new自带类型无需转换
  2. new自动调用构造函数,delete调用析构;malloc仅分配裸内存
  3. 数组分配必须配套delete[],malloc统一free
// C mallocint*arr=(int*)malloc(5*sizeof(int));arr[0]=1;free(arr);
// C++ new/deleteint*arr=newint[5];arr[0]=1;delete[]arr;int*num=newint(10);deletenum;

硬性规则:malloc搭配free,new搭配delete,禁止混用。

五、标准库对比:C库 vs C++ STL

相同点

  1. C全部标准库可在C++使用;
  2. 都提供字符串、数学、时间、文件工具;
相同案例
#include<cstring>charstr[20]="hello";strcat(str," c");// C字符串函数正常使用

详细区别

1. 头文件格式
  • C:.h后缀string.hstdio.h
  • C++:无.h<string><vector><algorithm>
2. 字符串处理
// C char数组,手动管理'\0'#include<string.h>chars[20]="hi";strcat(s," c");printf("%d",strlen(s));
// C++ std::string,自动管理内存#include<string>string s="hi";s+=" c++";cout<<s.size();
3. 动态容器(C无)

C只能malloc手动扩容;C++ vector动态数组自动管理内存

// C 变长数组需要手动扩容,繁琐int*vec=(int*)malloc(3*sizeof(int));
// C++ vector#include<vector>vector<int>vec;vec.push_back(1);vec.push_back(2);
4. 内置算法

C需要手写排序;C++ algorithm自带sort

vector<int>v={3,1,2};sort(v.begin(),v.end());

六、核心分水岭:C struct vs C++ class 面向对象

相同点

都能存储一组自定义数据,.访问变量、->指针访问语法通用。

相同案例
structStu{intid;};structStus;s.id=10;structStu*p=&s;p->id=20;
structStu{intid;};Stu s;s.id=10;Stu*p=&s;p->id=20;

巨大差异

  1. C struct 只有变量,无成员函数;C++ class 数据+行为绑定
  2. C无访问权限;C++ public/private/protected 控制外部访问
  3. C无构造、析构、继承、多态;C++完整支持面向对象三大特性
// C:函数只能写在结构体外部structStudent{intid;charname[20];};voidprint(structStudents){printf("%d %s",s.id,s.name);}
// C++ class 封装数据与方法#include<iostream>#include<string>usingnamespacestd;classStudent{private:intid;string name;public:voidset(inti,string n){id=i;name=n;}voidshow(){cout<<id<<" "<<name<<endl;}};intmain(){Student s;s.set(1001,"小明");s.show();return0;}

七、其他补充差异点

1. 模板 template(C无泛型)

区别

C通用工具只能用void*强转,重复代码;C++模板一套代码适配多类型

// C++ 泛型函数模板template<typenameT>Tadd(T a,T b){returna+b;}add(1,2);add(1.5,2.5);

2. 异常处理 try-catch(C无)

区别

C靠返回值判断错误;C++结构化捕获异常

try{inta=10,b=0;if(b==0)throw"除数不能为0";}catch(constchar*err){cout<<err;}

3. C++推荐用const/inline替代宏

区别

C大量#define宏,无类型检查;C++ const常量、inline函数更安全

// C 宏#defineMAX100#defineADD(a,b)a+b
// C++ 替代方案constintMAX=100;inlineintadd(inta,intb){returna+b;}

八、总结

一、完全通用、直接复用(不用重学)

基础类型、运算符、循环分支、指针数组、基础函数、C标准库、文件操作、struct基础、内存分区逻辑,全部可以直接迁移到C++。

二、C++新增/改良(需要重点学习)

  1. 语法:自由定义变量、bool、const强化、引用、namespace、函数重载/默认参数、新式强制转换
  2. IO:cin/cout 流输入输出
  3. 内存:new/delete 替代malloc/free
  4. 标准库:string、vector、STL容器与算法
  5. 面向对象:class、封装、继承、多态、构造/析构、this指针
  6. 高级特性:模板、try-catch异常、inline替代宏

学习路线建议

  1. 过渡期可以混用C代码,熟悉后逐步替换C++特性;
  2. 指针是两门语言共用核心,吃透指针才能学好STL与类;
  3. 严格区分两套IO、两套内存分配API,不要交叉混用;
  4. 学习重心放在class与STL,这是C++对比C最大优势。

c语言到c++是不同类型的编程语言,是从面向过程到面向对象的进步,简单来说越“高级”的语言,我们的编程就越容易,当然,随着我们解决问题的逻辑改变,我们的思考方式也要有所转变,从用函数(function)为基本单元解决问题,到以对象(object)为单元解决问题,这是才是我们学习的核心。

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

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

立即咨询