一。C++ 中的 const 知识点详解
C++ 中的 const 知识点详解
const 是 C++ 中一个重要的关键字,用于定义常量或指定不可修改的对象。以下是关于 const 的全面知识点总结:
1. 基本用法
1.1) 定义常量
const int MAX_VALUE = 100; // 常量,初始化后不可修改
// MAX_VALUE = 200; // 错误:不能修改常量
1.2) 指针与 const
const int* ptr1; // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2; // 同上
int* const ptr3; // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)
2. 函数中的 const
2.1)const 参数
void print(const std::string& str) {
// str 不能被修改
std::cout << str << std::endl;
}
2.2)const 成员函数
class MyClass {
public:
int getValue() const { // 常量成员函数,不能修改成员变量
return value_;
}
void setValue(int v) { // 非常量成员函数
value_ = v;
}
private:
int value_;
};
3. 类中的 const
3.1)const 成员变量
class MyClass {
public:
MyClass(int v) : value_(v) {} // 必须在初始化列表中初始化
private:
const int value_;
};
3.2)const 对象
const MyClass obj(10);
// obj.setValue(20); // 错误:不能调用非常量成员函数
int val = obj.getValue(); // 可以调用常量成员函数
4. const 返回值
const int* getPointer() {
static int value = 42;
return &value;
}
// 防止返回的指针被用于修改值
5. constexpr (C++11 引入)
constexpr int square(int x) {
return x * x;
}
constexpr int size = square(10); // 编译时常量
6. const 重载
void process(int& val) { /* ... */ }
void process(const int& val) { /* ... */ }
int getValue() const { // 常量成员函数,不能修改成员变量
return value_;
}
void setValue() { // 非常量成员函数
value_ = 10;
}
7. mutable 关键字
class MyClass {
public:
void doSomething() const {
count_++; // mutable 成员可以在常量对象中被修改
}
private:
mutable int count_ = 0;
};
8. const 引用与临时对象
const std::string& getString() {
return "Hello"; // 绑定到临时对象是安全的
}
9. const 转换
void print(const std::string& s);
std::string str = "test";
print(str); // 正确:非常量可以转为常量
print("test"); // 正确:字符串字面量转为 const char*
10. const 正确性的好处
提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化
常见面试题
1.const int*, int const* 和 int* const 的区别?
2. 如何在常量成员函数中修改成员变量?mutable
3.为什么成员函数要有const 重载?
通过 const 重载,可以为一个类提供两种接口:一种用于修改对象,另一种用于只读访问。
4.const 和 constexpr 有什么区别?
const
表示“不可修改”,适用于运行时逻辑,防止意外修改对象或变量。
constexpr
表示“编译期常量”,适用于需要编译期优化的场景(如数组大小、模板参数),要求值必须在编译期确定。
二. C 语言中 const 的主要知识点
在 C 语言中,const 关键字用于定义常量或指定不可修改的对象。以下是关于 C 语言中 const 的主要知识点总结:
1. 基本用法
1.1)定义常量
const int MAX_VALUE = 100; // 常量,初始化后不可修改
// MAX_VALUE = 200; // 错误:不能修改常量
1.2)指针与 const
const int* ptr1; // 指向常量对象的指针(指针指向的内容不可变)
int const* ptr2; // 同上
int* const ptr3; // 常量指针(指针本身不可变,但指向的内容可变)
const int* const ptr4; // 指向常量对象的常量指针(指针和内容都不可变)
2. 函数参数中的 const
void print(const char* str) {
// str 不能被修改
printf("%s\n", str);
}
3. const 返回值
const int* getPointer() {
static int value = 42;
return &value;
}
// 防止返回的指针被用于修改值
4. 数组与 const
const int arr[] = {1, 2, 3}; // 常量数组,内容不可修改
// arr[0] = 4; // 错误:不能修改常量数组元素
5. 结构体与 const
5.1const 结构体成员
struct Point {
const int x;
const int y;
};
// 必须在初始化时赋值
struct Point p = {.x = 1, .y = 2};
5.2const 结构体变量
struct Point p = {1, 2};
const struct Point cp = p;
// cp.x = 3; // 错误:不能修改常量结构体成员
6. const 转换
void print(const char* s);
char str[] = "test";
print(str); // 正确:非常量可以转为常量
print("test"); // 正确:字符串字面量转为 const char*
7. const 正确性的好处
提高代码安全性:防止意外修改
明确编程意图
允许函数接受常量和非常量参数
优化机会:编译器可能进行更好的优化
注意事项
- C 语言中的 const 变量默认具有外部链接性,除非显式声明为 static。
- 在 C 语言中,const 变量并不是真正的常量表达式,不能用于数组大小声明等需要常量表达式的场合。
- C 语言中的 const 变量可以通过指针间接修改(如果指针不是 const 限定的),这被认为是一个设计缺陷。
示例代码
#include <stdio.h>
int main() {
const int a = 10;
// a = 20; // 错误:不能修改常量
const int* ptr = &a;
// *ptr = 30; // 错误:不能通过 ptr 修改 a
int b = 20;
int* const ptr2 = &b;
*ptr2 = 30; // 正确:可以修改 b
// ptr2 = &a; // 错误:不能修改 ptr2
return 0;
}