详细解析int GetLength() const;声明中的const是修饰什么的?
书籍:《Visual C++ 2017从入门到精通》的2.7.3 中的字符串
环境:visual studio 2022
内容:GetLength()
在 C++ 中,int GetLength() const;
声明中的 const
关键字用于修饰 成员函数本身,而非返回值。以下是详细解析:
1. const
的作用
-
修饰成员函数:
const
表示该成员函数是一个 常量成员函数,承诺 不会修改类的任何成员变量(除非成员变量被声明为mutable
)。- 核心作用:保证函数执行期间对象的逻辑状态不变。
- 调用限制:只能被
const
对象调用,普通对象也可调用。
-
不修饰返回值:
返回值类型是int
,与const
无关。若需返回常量值,需显式声明返回类型为const int
(但通常不需要)。
2. 示例代码解析
关键点:
-
函数声明中的
const
:- 表示
GetLength()
是常量成员函数,不能修改MyClass
的实例变量(如length
)。 - 允许
const MyClass
对象调用该函数:const MyClass obj; int len = obj.GetLength(); // 合法
- 表示
-
返回值类型:
- 返回值是
int
,与const
无关。即使返回值为const int
,也需显式声明:const int GetLength() const { return length; } // 返回 const int
- 返回值是
3. const
成员函数的约束
-
禁止修改成员变量:
int GetLength() const { length = 10; // 错误!不能修改成员变量 return length; }
-
允许读取
mutable
成员:
若成员变量被声明为mutable
,即使在const
函数中也可修改:class MyClass { mutable int cache; // 允许在 const 函数中修改 public: int GetLength() const { cache = 100; // 合法 return cache; } };
4. 为什么需要 const
成员函数?
- 接口安全性:
明确函数的意图是只读操作,避免意外修改对象状态。 - 兼容性:
允许const
对象调用,增强代码灵活性。 - 多线程安全:
在多线程环境中,const
函数可降低数据竞争风险。
5. 对比非 const
成员函数
特性 | const 成员函数 | 非 const 成员函数 |
---|---|---|
能否修改成员变量 | 只能修改 mutable 成员 | 可以修改所有成员变量 |
调用对象限制 | 只能被 const 对象调用 | 可被任意对象调用 |
代码安全性 | 更高(防止意外修改) | 较低 |
6. 总结
- **
const
修饰的是成员函数本身**,表示该函数不会修改对象状态。 - 返回值类型与
const
无关,可以是普通类型或const
类型(需显式声明)。 - 核心价值:通过约束函数行为,提升代码安全性和可维护性。
通过合理使用 const
,可以设计出更健壮、清晰的类接口。