在C++里,const修饰指针时,位置不同,语义截然不同。这可不是什么“差不多”的事,编译器会据此进行完全不同的类型检查。位置写错,轻则函数调用失败,重则逻辑被绕过却毫无报错。

const int* p 和 int* const p:编译期就不是同一个类型

前者是“指向常量的指针”,后者是“常量指针”。它们在类型系统里互不兼容,不能隐式转换,也不能用于重载区分(因为顶层cv-qualifier不参与函数签名)。

字符串字面量:强制要求const char*

"hello"这种字面量,类型是const char[6]。现代C++(C++11起)禁止隐式转成char*。这不是警告,是硬性编译错误。

const成员函数:内部只能调用const成员函数

声明为void foo() const的函数,其this指针类型是const MyClass*。这意味着所有非mutable成员变量都变成只读,且只能调用其他const成员函数。

const引用参数:不只是“防手抖”,更是契约与生命周期管理

void f(const std::string& s),重点不在于防止你内部误改s,而在于告诉调用方:“我不会动你传来的对象”,并让编译器据此优化(如省去隐式拷贝)和延长临时对象生命周期。

真正难的不是记住哪边是“指针常量”,而是写出const正确的类——每个访问器是否标记const,哪些字段该加mutable,返回引用时要不要const,这些组合起来才构成完整的只读契约。漏掉一个点,整个const系统就形同虚设。

本文转载于:https://www.php.cn/faq/2345751.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。