【C++ 笔记】从 C 到 C++:核心过渡
【C 笔记】从 C 到 C核心过渡这是一篇系统、实用的过渡指南帮助熟悉 C 语言的开发者快速掌握 C 的核心差异与现代特性。C 被誉为“带类的 C”C with Classes它几乎完全兼容 CC 是 C 的超集但新增了面向对象OOP、泛型编程、更强的类型安全和现代标准库让代码更安全、更优雅、更易维护同时保留 C 的高效与底层控制力。C 不是“换个语法”的 C而是多范式语言过程式 OOP 泛型 函数式。建议先把 C 当作“更好的 C”来用逐步引入新特性。1. 为什么从 C 过渡到 C兼容性绝大多数合法 C 代码可直接作为 C 编译用g编译.c文件也行但推荐后缀.cpp。优势更严格的类型检查减少隐式转换错误。自动内存管理机制RAII。标准库STL极大提升生产力。支持大型项目维护封装、继承、多态。适用场景系统编程、游戏引擎、嵌入式、高性能计算、竞赛编程等。C 更适合极致轻量或纯过程式场景。编译器推荐GCC/Clangg -stdc20、MSVC。现代 C 强烈建议用C17 或 C20标准。2. 第一个程序Hello World 对比C 风格兼容#includestdio.hintmain(){printf(Hello, World!\n);return0;}C 现代风格#includeiostreamintmain(){std::coutHello, World!std::endl;return0;}差异头文件C 用stdio.hC 推荐iostream无.h。输入输出printf/scanf→std::cout/cin自动类型推导支持运算符重载。std::命名空间避免全局命名冲突。使用命名空间简化usingnamespacestd;// 不推荐在头文件中使用coutHelloendl;3. 核心语法与特性差异C → C(1) 输入输出与命名空间NamespaceC 无命名空间容易全局冲突。C 用namespace解决namespaceMySpace{intx10;voidfunc(){}}// 使用方式MySpace::x;// 指定访问usingMySpace::func;// 部分展开usingnamespaceMySpace;// 全部展开小心冲突(2) 函数增强默认参数Default Argumentsvoidprint(inta,intb0){// b 默认值为 0// ...}print(5);// 等价于 print(5, 0)注意默认参数必须从右到左连续定义。函数重载Overloading同名函数参数个数/类型/顺序不同返回值不影响voidfunc(intx){}voidfunc(doublex){}voidfunc(intx,inty){}inline 函数建议编译器内联展开减少函数调用开销C99 也有但 C 更常用。引用Reference别名更安全替代指针。voidswap(inta,intb){// 传引用无需指针inttempa;ab;btemp;}(3) 类型系统与常量bool 类型C 原生true/falseC 中常用int。nullptr代替 C 的NULL避免宏问题。constC 中const更严格常用于常量表达式。类型别名typedef→usingC11更灵活usinglllonglong;(4) 内存管理Cmalloc/calloc/realloc/free不调用构造函数。Cnew/delete自动调用构造函数/析构函数。int*pnewint(10);// 初始化deletep;int*arrnewint[5]{};// 数组 值初始化delete[]arr;现代 C 强烈推荐智能指针RAII避免内存泄漏#includememorystd::unique_ptrintupstd::make_uniqueint(42);std::shared_ptrintspstd::make_sharedint(100);(5) 结构体 vs 类ClassCstruct仅数据成员。Cstruct/class几乎相同默认访问权限不同struct publicclass private。支持封装、构造函数/析构函数、成员函数classPoint{private:intx,y;public:Point(inta0,intb0):x(a),y(b){}// 构造函数~Point(){}// 析构函数voidshow()const{/* ... */}};核心 OOP封装private/protected/public继承class Derived : public Base多态虚函数virtual 重写overrideC11(6) 其他重要差异类型转换C 更安全static_cast、dynamic_cast、const_cast、reinterpret_cast。void指针*C 不能隐式转换为其他指针类型更严格。枚举C11enum class强类型枚举。初始化C 支持列表初始化{}uniform initializationC11。4. 现代 C 核心特性C11 及以后——“新语言”级提升C11 被誉为“现代 C”起点后续 C14/17/20/23 持续演进auto 类型推导autox5;// intautovstd::vectorint{1,2,3};范围 for 循环Range-based forfor(autoelem:vec){/* ... */}Lambda 表达式匿名函数autoadd[](inta,intb){returnab;};std::sort(vec.begin(),vec.end(),[](inta,intb){returnab;});移动语义Move Semantics 右值引用高效转移资源避免不必要拷贝。智能指针、std::array、std::tuple等。constexpr编译期计算。线程支持thread、原子操作、异常处理try/catch。STL 容器与算法远超 C 的手动实现std::vector动态数组、std::string、std::map、std::unordered_map等。算法std::sort、std::find、std::accumulate。5. 最佳实践与注意事项过渡期避坑从“更好 C”开始先用cout、vector、string再学类。避免裸new/delete用智能指针、全局using namespace std;头文件、C 风格数组优先std::array或vector。性能C 零开销抽象Zero-overhead principle用好 RAII 和移动语义可比 C 更快。编译选项-stdc20 -Wall -Wextra -O2。常见错误忘记delete[]或析构函数。隐式转换导致 bugC 更严格。多线程下共享数据未同步。自定义类型作为 key需重载operator或提供哈希函数。6. 学习路径建议掌握基础过渡本笔记内容→ 写小项目如学生管理系统。深入 OOP STL。现代 C读《Effective Modern C》、《C Primer》第 5 版及以后。实践LeetCodeC、实现简单数据结构、贡献开源。进阶模板元编程、并发、C20 模块Modules、协程、Ranges。通过以上过渡你会发现 C 代码更简洁、安全且在大型项目中维护性远超纯 C。C 不是取代 C而是让 C 程序员拥有更强大的武器。如果需要具体章节扩展如类与继承详解、STL 容器对比、现代 C11/14/17/20 特性代码示例、或某个项目的完整过渡案例随时告诉我加油掌握 C 后你的编程视野会打开新世界。参考常见 C/C 对比资料与现代标准演进实践时以编译器实际行为为准。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415314.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!