当前位置: 首页 > 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.dtcms.com/a/298408.html

相关文章:

  • day33:零基础学嵌入式之网络——HTTP服务端
  • 某AI智能问答系统规划与设计
  • 【Java】JVM虚拟机(基本概念、类加载机制)
  • 苍穹外卖笔记集锦
  • 函数f(int a,int b),a和b的地址关系?
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——5. 集成OpenCV:让程序拥有“视力”
  • 【NetTopologySuite库】使用Polygonizer线构面,并获取割边、悬挂边、无效环
  • ✨ 使用 Flask 实现头像文件上传与加载功能
  • TIM 实现定时中断【STM32L4】【实操】
  • 原生微信小程序如何调整开发版本
  • 全面解析MySQL(3)——CRUD进阶与数据库约束:构建健壮数据系统的基石
  • 数仓主题域划分
  • 机器学习(一)KNN,K近邻算法(K-Nearest Neighbors)
  • 不用电脑要不要关机?
  • win通过OpenSSL生成.ssh id_rsa密钥方法
  • 反射和SPI
  • 【DeepRare】疾病识别召回率100%
  • Haprxy七层代理
  • 呼叫中心系统管理权限功能配置
  • 深度学习篇---图片分辨率
  • Agentic RAG理解和简易实现
  • AMD官网下载失败,不让账户登录下载
  • 集合专题之Map
  • Kimi K2 大语言模型技术特性与应用实践分析
  • 初识opencv04——图像预处理3
  • 太极生两仪,两仪生四象,四象生八卦
  • mybatisX的自定义模板生成
  • 【深基12.例1】部分背包问题 Java
  • docker 挂载卷
  • 【C++】二叉搜索数