资讯动态

《Eigen入门》第 10 章 · const、作用域与命名空间

发布时间:2026/10/18 5:15:07 来源:尧图企业网站定制
这一章讲三个让代码更安全、更有条理的工具const保护数据、作用域变量在哪有效、命名空间避免名字冲突。理解它们代码质量和可读性会上一个台阶。10.1 const保护数据不被修改const是常量的意思用来声明这个值不许改。const 变量constintMAX100;// MAX 200; // 错误const 变量不能修改const 参数函数参数加const保证函数内不改这个参数voidprint(conststd::strings){// s 改它; // 错误s 是 const不能改std::coutsstd::endl;}const 成员函数类的方法加const表示这个方法不会修改对象的成员classRectangle{doublew,h;public:doublearea()const{// const 方法只读不改成员returnw*h;}};const方法只能调用其他const方法编译器会帮你把关。核心思想用const表达我承诺不改让编译器帮你守住承诺把 bug 消灭在编译期。10.2 作用域变量在哪里有效作用域scope决定了变量在代码的哪一段可见、可用。花括号{}形成作用域#includeiostreamintmain(){intx10;// x 在整个 main 里有效{inty20;// y 只在这个花括号内有效std::coutx ystd::endl;// 都能访问}// std::cout y; // 错误y 已经出了作用域不存在了return0;}输出10 20。变量在其声明的花括号{}内有效出了花括号就销毁了。全局变量 vs 局部变量#includeiostreamintglobal100;// 全局变量整个文件都可见intmain(){intlocal10;// 局部变量只在 main 里可见std::coutglobal localstd::endl;// 100 10}建议尽量用局部变量少用全局变量。全局变量到处都能改容易出 bug、难追踪。10.3 命名空间避免名字冲突想象两个人都给变量起名PI放在一起就冲突了。命名空间namespace就是给代码划区域隔离同名。#includeiostreamnamespacemathA{constdoublePI3.14;}namespacemathB{constdoublePI3.14159;}intmain(){std::coutmathA::PIstd::endl;// 3.14std::coutmathB::PIstd::endl;// 3.14159同名不冲突}用命名空间::名字精确指定要哪个。using简化前缀std::写多了烦可以用using// using 声明只引入一个名字推荐usingstd::cout;cout你好std::endl;// using 指令引入整个命名空间省事但易冲突慎用usingnamespacestd;cout直接用 coutendl;建议初学时尽量写全std::养成好习惯。using namespace std;虽然省事但在大项目里容易引发名字冲突。std 和 Eigen 命名空间现在你就懂了std::cout、std::string标准库里的东西都在std命名空间Eigen::MatrixXdEigen 库的东西都在Eigen命名空间这就是为什么写 Eigen 代码时前面都有Eigen::。10.4 头文件与多文件组织了解真实项目不止一个 .cpp 文件代码会拆分组织project/ ├── main.cpp # 主程序 ├── math_utils.h # 头文件声明函数和类 └── math_utils.cpp # 源文件实现头文件.h放声明源文件.cpp放实现。其他文件要使用时#include头文件即可。// math_utils.h —— 头文件#pragmaonce// 防止头文件被重复包含intadd(inta,intb);// 只声明不实现// math_utils.cpp —— 源文件#includemath_utils.hintadd(inta,intb){// 实现returnab;}// main.cpp#includeiostream#includemath_utils.h// 引入自己的头文件intmain(){std::coutadd(3,5)std::endl;// 8}#pragma once防止同一个头文件被多次包含避免重复定义。#include ...双引号用于自己项目的头文件#include ...尖括号用于系统/库头文件。这三个文件要一起编译——把两个 .cpp 都交给编译器链接器才能找到add的实现g-stdc17 main.cpp math_utils.cpp-oapp.exe ./app.exe# 输出 8漏掉math_utils.cpp会得到一个典型的链接期错误编译能过链接失败undefined reference to add(int, int)MSVC 写法cl /std:c17 /EHsc /utf-8 main.cpp math_utils.cpp。文件更多时就不用手动列了交给 CMake附录 C.6C.7。10.5 小结const保护数据const 变量、const 参数、const 方法。作用域变量在声明它的{}内有效。命名空间隔离同名Eigen::、std::都是命名空间。多文件头文件放声明源文件放实现#include引入。下一章学习动态内存与智能指针——在运行时灵活分配内存而不泄漏。练习题写一个const变量尝试修改看报什么错。写两个命名空间里面各放一个同名变量分别访问。写一个类给它加一个const成员函数说明它为什么不能修改成员。把一个函数拆到头文件和源文件里在 main 里调用它。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑