C++const正确性编程
C++const正确性编程
const正确性是指使用const关键字明确表示哪些值不应被修改。这是C++编程中重要的设计原则,可以提高代码的安全性和可读性。
const成员函数承诺不修改对象状态,可以被const对象调用。
#include
#include
#include
class Person {
std::string name_;
int age_;
mutable int access_count_;
public:
Person(const std::string& name, int age)
: name_(name), age_(age), access_count_(0) {}
const std::string& name() const { return name_; }
int age() const { return age_; }
void set_name(const std::string& name) { name_ = name; }
void set_age(int age) { age_ = age; }
int get_access_count() const {
++access_count_;
return access_count_;
}
void display() const {
std::cout << name_ << " (" << age_ << ")\n";
}
};
void const_member_demo() {
const Person p1("Alice", 30);
p1.display();
std::cout << "Name: " << p1.name() << "\n";
std::cout << "Access count: " << p1.get_access_count() << "\n";
Person p2("Bob", 25);
p2.set_age(26);
p2.display();
}
const引用参数避免拷贝且保证不修改。
void print_vector(const std::vector& vec) {
for (int v : vec) {
std::cout << v << " ";
}
std::cout << "\n";
}
int sum_of(const std::vector& vec) {
int total = 0;
for (int v : vec) total += v;
return total;
}
void const_ref_demo() {
std::vector data = {1, 2, 3, 4, 5};
print_vector(data);
std::cout << "Sum: " << sum_of(data) << "\n";
}
const指针和指向const的指针。
void const_pointers() {
int x = 10, y = 20;
const int* ptr1 = &x;
ptr1 = &y;
std::cout << "ptr1 points to " << *ptr1 << "\n";
int* const ptr2 = &x;
*ptr2 = 30;
const int* const ptr3 = &x;
std::cout << "ptr3: " << *ptr3 << "\n";
}
const返回值防止对临时对象的修改。
class String {
char* data_;
public:
explicit String(const char* str) {
data_ = new char[std::strlen(str) + 1];
std::strcpy(data_, str);
}
~String() { delete[] data_; }
const char* c_str() const {
return data_;
}
};
mutable允许const成员函数修改特定成员。
class Cache {
mutable bool cached_;
mutable int cached_value_;
int compute() const {
std::cout << "Expensive computation\n";
return 42;
}
public:
Cache() : cached_(false), cached_value_(0) {}
int get_value() const {
if (!cached_) {
cached_value_ = compute();
cached_ = true;
}
return cached_value_;
}
};
void mutable_demo() {
const Cache cache;
std::cout << "Value: " << cache.get_value() << "\n";
std::cout << "Cached: " << cache.get_value() << "\n";
}
const_iterator保证只读遍历。
void const_iterator_demo() {
std::vector vec = {10, 20, 30, 40, 50};
for (auto it = vec.cbegin(); it != vec.cend(); ++it) {
std::cout << *it << " ";
}
std::cout << "\n";
}
const重载选择不同行为。
struct OverloadDemo {
void func() {
std::cout << "non-const version\n";
}
void func() const {
std::cout << "const version\n";
}
};
void const_overload() {
OverloadDemo obj;
const OverloadDemo const_obj;
obj.func();
const_obj.func();
}
const与引用限定符结合。
class DataHolder {
std::vector data_{1, 2, 3};
public:
const std::vector& get() const& {
return data_;
}
std::vector get() && {
return std::move(data_);
}
};
const正确性使代码意图更明确,减少bug,是编写高质量C++代码的基本要求。
