news 2026/3/1 2:48:52

Effective C++学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Effective C++学习笔记

一.视C++为一个语言联邦

融合了多种编程思维方式

C++ 同时支持四种编程范式(paradigms)

procedural-based(过程式)
object-based(基于对象)
object-oriented(面向对象)
generics(泛型)

这四种范式不是“可选”的,而是交织在一起的,你必须都懂,才能看懂别人写的代码,甚至才能看懂标准库。

范式举例特点
过程式std::sort(arr, arr+n)像 C 一样,函数+数据分离
基于对象std::string s; s.size();有封装,但无继承多态
面向对象class Derived : public Base继承、多态、虚函数
泛型template<typename T> void foo(T t)编译期多态、模板元编程

二.尽量以const,enum,inline替换#define

1.静态成员变量:只有一份存储,不属于任何对象→ 编译器必须在一个翻译单元里给它真正的内存定义

规则是:

  • 声明放在类体内(带static)。

  • 定义(即分配存储)放在类外只能出现一次;通常放在.cpp文件。

  • 例外:如果它是整型或枚举类型的 const 静态成员,并且初始化值是常量表达式,C++11 起允许在类内直接给初值,此时可省略类外定义——只要代码里从不取它的地址或绑定引用即可。一旦有人&Foo::value或把它传给const int&,就必须再补一份类外定义。

//.hpp class Foo { static int a; // ① 非 const:类内只能声明 static const int b = 42; // ② const 整型:类内给初值 static constexpr int c = 5; // ③ constexpr:类内直接是定义 }; //.cpp int Foo::a = 0; // ① 必须定义 // const int Foo::b = 42; // ② 如果没人取地址,可省;否则要这一行

2.静态成员函数

  • 没有this指针,也不占对象空间,不存在“初始化”概念

  • 声明与定义都可以写在类内或类外,不会重复链接冲突

三.尽可能用const

1.const vector<int>::itrrator iter = xxx;//iter的作用像T* const,指向不可变,内容可变

vector<int>::const_iterator citer = xxx;//iter的作用像const T*,指向可变,内容不可变

2.const成员函数

成员函数版本通行证颜色对数据成员的“默认权限”
非 const 成员函数绿色通行证读写均可
const 成员函数红色通行证只读;写操作一律当成“违章”
变量身份绿色函数(非 const)红色函数(const)典型错误提示
① 非 const 成员变量读 ✅ 写 ✅读 ✅ 写 ❌“assignment of member … in read-only object”
② const 成员变量读 ✅ 写 ❌读 ✅ 写 ❌同上;两种函数都不能写
③ mutable 成员变量读 ✅ 写 ✅读 ✅ 写 ✅无;mutable 是“红证特区”
④ static 成员变量(不论是否 const)读写均不受成员函数 const 性影响;它们不属于任何对象,通行证颜色管不到它们。

常见迷思一次澄清

  • “const 成员函数只能访问 const 成员变量?”
    → 错!任何成员都能访问,只是不能写非 const、非 mutable 的成员。

  • “非 const 成员函数不能读 const 成员变量?”
    → 错!读永远允许,写才受限制。

  • “我把对象定义成const Demo obj;后,还能调非 const 成员函数吗?”
    → 不能。对象本身持红色通行证,只能调红色成员函数。

3.在const和non-const成员函数中避免重复

non-const函数内部调用const成员函数,为避免重复调用,需要将Text&使用static_cast转换const Text&,最后返回值使用const_cast移除const。

四.确定对象被使用前已被初始化

1.永远在使用对象(变量)之前将他初始化,对于无任何成员的内置类型,必须手动完成,对于以外的东西,初始化责任落在构造函数中,确保每一个构造函数都将对象的每一个成员初始化,注意别混淆复制与初始化

2.成员初值列进行初始化,成员初始化顺序,基类最先然后是继承类,class的成员变量总是以其声明次序被初始化

3.不同编译单元内定义的non-local static对象的初始化次序

解决“跨编译单元 non-local static 对象初始化顺序未定义”问题的黄金法则:

把每一个 non-local static 都变成 local static,并靠函数接口返回引用——即 Singleton 模式的核心手法。

“跨文件全局变量顺序不可控?包一层函数,把 non-local static 变 local static——初始化顺序立刻由自己掌控。”


为什么 local static 能救命

  1. C++ 保证:首次遇到控制流时才会初始化 local static 变量

  2. 初始化顺序由第一次调用函数的顺序决定,而调用顺序是你写的代码,可见、可控;

  3. 同时满足“全局唯一 + 延迟构造 + 线程安全”(C++11 起,local static 初始化是线程安全的)。


最简洁的替代模板

// 原全局变量 // extern int g_config; // 别的 cpp 用 // 替换后 int& getConfig() // 返回引用,保证全局唯一 { static int config = readFromFile(); // 第一次调用才初始化 return config; }

任何文件用它:

int v = getConfig(); // 不再直接依赖 g_config

带类版本的通用骨架

class Config { public: static Config& instance() { // 返回引用 static Config inst; // local static return inst; } int value() const { return val_; } void setValue(int v) { val_ = v; } private: Config() : val_(readFromFile()) {} int val_; };
Config::instance().setValue(42); int x = Config::instance().value();
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 19:51:04

PyTorch-CUDA-v2.6镜像支持PPO强化学习算法吗?RLHF基础环境搭建

PyTorch-CUDA-v2.6镜像支持PPO强化学习吗&#xff1f;RLHF环境搭建实战 在大模型对齐&#xff08;alignment&#xff09;任务日益成为AI系统落地关键环节的今天&#xff0c;基于人类反馈的强化学习&#xff08;RLHF&#xff09;正从实验室走向工程化部署。而作为其核心训练算法…

作者头像 李华
网站建设 2026/2/28 13:19:13

实现关系型数据库需要完成的任务

一、目的猜测关系型数据库服务器的实现需要完成哪些主要任务。二、实现关系型数据库要完成的任务1、服务端和客户端的TCP通信协议实现。兼容加密和明文两种TCP连接方式。客户端发给服务端的命令只能是SQL语句。服务端回复的数据包分为&#xff1a;"普通结果包"和&quo…

作者头像 李华
网站建设 2026/2/26 22:21:33

BRAM与外部存储器在通信模块中的协同工作:全面讲解

BRAM与DDR的“双剑合璧”&#xff1a;通信模块中的存储协同实战解析你有没有遇到过这样的场景&#xff1f;设计一个10Gbps以太网桥接器&#xff0c;数据流如潮水般涌来。你刚把一帧报文写进DDR&#xff0c;下一帧就已经到了FIFO入口——而此时CPU还在为上一个中断忙得焦头烂额。…

作者头像 李华
网站建设 2026/2/26 3:49:21

基于Django的本地健康宝微信小程序系统【源码文末联系】

基于Django的本地健康宝微信小程序系统 三个角色&#xff08;管理员&#xff0c;用户&#xff0c;医护人员&#xff09; 效果如下&#xff1a; 登录页面疫苗信息管理页面论坛分类页面新闻资讯页面用户首页面疫苗信息页面交流论坛页面地图页面研究背景 在信息技术飞速发展和智能…

作者头像 李华
网站建设 2026/2/27 17:28:16

适用于远程教学的proteus8.16下载安装教程操作指南

手把手教你搭建远程电子实验环境&#xff1a;Proteus 8.16 安装全解析你有没有遇到过这样的情况&#xff1f;学生在家上《单片机原理》课&#xff0c;老师讲得头头是道&#xff0c;可一到动手环节——“老师&#xff0c;我装不上 Proteus&#xff01;”、“仿真打不开&#xff…

作者头像 李华