当前位置: 首页 > news >正文

Effective C++ 条款01:视 C++ 为一个语言联邦

Effective C++ 条款01:视 C++ 为一个语言联邦


核心思想:C++ 是由多个子语言组成的联邦,每个子语言有自己的编程范式。理解这些子语言及其规则切换,是写出高效 C++ 代码的关键。

四个子语言及其规则:
  1. C 语言
    • 基础:过程式编程,包含指针、数组、预处理等。
    • 规则:按值传递高效(如内置类型)。
  2. 面向对象 C++
    • 核心:类、封装、继承、多态、虚函数。
    • 规则:优先按 const 引用传递对象。
  3. 模板 C++
    • 特性:泛型编程、模板元编程。
    • 规则:编译期推导类型,需注意依赖类型(typename)。
  4. STL(标准模板库)
    • 组件:容器、迭代器、算法、函数对象。
    • 规则:迭代器按值传递(类似指针)。

代码示例

1. C 语言部分:内置类型按值传递
#include <iostream>// 内置类型高效按值传递
void printInt(int val) {  // 推荐:直接传递 intstd::cout << "Value: " << val << std::endl;
}int main() {int x = 42;printInt(x);  // 高效拷贝return 0;
}
2. 面向对象 C++:对象按 const 引用传递
#include <string>class Person {
public:Person(std::string name) : name_(std::move(name)) {}virtual ~Person() = default;virtual std::string role() const { return "Person"; }protected:std::string name_;
};class Student : public Person {
public:using Person::Person;std::string role() const override { return "Student"; }
};// 按 const 引用传递避免拷贝和多态失效
void printRole(const Person& p) {  // 正确:支持多态,无拷贝std::cout << p.role() << std::endl;
}int main() {Student s("Alice");printRole(s);  // 输出 "Student"(多态生效)return 0;
}
3. 模板 C++:使用 typename 声明依赖类型
#include <vector>template<typename T>
class Container {
public:using Iterator = typename T::iterator;  // 必须用 typenamestatic Iterator begin(T& container) {return container.begin();}
};int main() {std::vector<int> vec = {1, 2, 3};auto it = Container<std::vector<int>>::begin(vec);return 0;
}
4. STL:迭代器按值传递
#include <vector>
#include <algorithm>// 迭代器按值传递(类似指针)
template<typename Iter>
void printFirstTwo(Iter begin, Iter end) {if (begin != end) {std::cout << *begin << " ";++begin;}if (begin != end) {std::cout << *begin << std::endl;}
}int main() {std::vector<int> nums = {10, 20, 30};printFirstTwo(nums.begin(), nums.end());  // 输出 "10 20"return 0;
}

关键总结

子语言典型场景参数传递规则
C 语言内置类型、指针、数组按值传递
面向对象 C++类、继承、虚函数const 引用传递
模板 C++泛型编程、元编程依赖类型用 typename
STL容器、迭代器、算法迭代器按值传递

编程启示:在切换子语言时(如从 STL 迭代器切换到面向对象),需同步切换编程策略,避免效率损失或错误。

http://www.xdnf.cn/news/1185355.html

相关文章:

  • php算法-- 关联数组使用,优化sip账号去重
  • MyBatis高级应用实战指南
  • 构建跨平台远程医疗系统中的视频通路技术方案探究
  • OT82111_VC1:USB OTG音频解码器固件技术解析
  • 华为昇腾NPU卡 文生音频[T2A]大模型suno/bark模型推理使用
  • Java研学-RabbitMQ(三)
  • 杂谈:前端开发中的常见问题
  • XCTF-crypto-幂数加密
  • iOS WebView 调试实战,文件上传与权限弹窗异常的排查路径
  • Oracle MCP本地部署测试
  • 卸油管连接检测误报率↓78%:陌讯多模态融合算法实战解析
  • [Rust 基础课程]猜数字游戏-获取用户输入并打印
  • 在Akamai云平台上为UGC流媒体进行实时转码
  • 百度快排技术分析的核心要素
  • AI小智源码分析——音频部分(一)
  • 【国内电子数据取证厂商龙信科技】谁是躲在“向日葵”后的
  • LE AUDIO CIS/BIS音频传输时延计算方法
  • nacos安装
  • 【57】MFC入门到精通——MFC 多线程编程总结
  • C++ string:准 STL Container
  • 力扣面试150题--寻找旋转排序数组中的最小值
  • C语言指针初步(4)-用void指针模拟qsort函数方法
  • [python][flask]Flask-Principal 使用详解
  • 秋招Day19 - 分布式 - 理论
  • CentOS 8 安装HGDB V4.5 psql命令执行报错
  • [python][flask]Flask-Login 使用详解
  • Mysql实现高可用(主从、集群)
  • Git指令
  • PyCharm高效开发全攻略
  • uniapp使用css实现进度条带动画过渡效果