Đang cố gắng thu thập một số cách sử dụng:
Liên kết một số tạm thời để tham chiếu đến const, để kéo dài tuổi thọ của nó. Tham chiếu có thể là một cơ sở - và hàm hủy của nó không cần phải là ảo - hàm hủy phải vẫn được gọi là:
ScopeGuard const& guard = MakeGuard(&cleanUpFunction);
Giải thích , sử dụng mã:
struct ScopeGuard {
~ScopeGuard() { } // not virtual
};
template<typename T> struct Derived : ScopeGuard {
T t;
Derived(T t):t(t) { }
~Derived() {
t(); // call function
}
};
template<typename T> Derived<T> MakeGuard(T t) { return Derived<T>(t); }
Thủ thuật này được sử dụng trong lớp tiện ích ScopeGuard của Alexandrescu. Khi tạm thời vượt ra khỏi phạm vi, hàm hủy của Derogen được gọi chính xác. Đoạn mã trên bỏ lỡ một số chi tiết nhỏ, nhưng đó là vấn đề lớn với nó.
Sử dụng const để nói với các phương thức khác sẽ không thay đổi trạng thái logic của đối tượng này.
struct SmartPtr {
int getCopies() const { return mCopiesMade; }
};
Sử dụng const cho các lớp copy-on-write , để làm cho trình biên dịch giúp bạn quyết định khi nào và khi nào bạn không cần sao chép.
struct MyString {
char * getData() { /* copy: caller might write */ return mData; }
char const* getData() const { return mData; }
};
Giải thích : Bạn có thể muốn chia sẻ dữ liệu khi bạn sao chép một cái gì đó miễn là dữ liệu của đối tượng ban đầu và copie'd vẫn giữ nguyên. Khi một trong các đối tượng thay đổi dữ liệu, tuy nhiên bạn cần có hai phiên bản: Một cho bản gốc và một cho bản sao. Đó là, bạn sao chép trên một ghi vào một trong hai đối tượng, để bây giờ cả hai đều có phiên bản riêng.
Sử dụng mã :
int main() {
string const a = "1234";
string const b = a;
// outputs the same address for COW strings
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
Đoạn mã trên in cùng một địa chỉ trên GCC của tôi, vì thư viện C ++ đã sử dụng thực hiện sao chép khi ghi std::string
. Cả hai chuỗi, mặc dù chúng là các đối tượng riêng biệt, chia sẻ cùng một bộ nhớ cho dữ liệu chuỗi của chúng. Tạo b
non-const sẽ thích phiên bản không const của operator[]
GCC và GCC sẽ tạo một bản sao của bộ nhớ đệm sao lưu, vì chúng ta có thể thay đổi nó và nó không ảnh hưởng đến dữ liệu của a
!
int main() {
string const a = "1234";
string b = a;
// outputs different addresses!
cout << (void*)&a[0] << ", " << (void*)&b[0];
}
Đối với trình xây dựng sao chép để tạo các bản sao từ các đối tượng const và tạm thời :
struct MyClass {
MyClass(MyClass const& that) { /* make copy of that */ }
};
Để tạo các hằng số không thể thay đổi
double const PI = 3.1415;
Để chuyển các đối tượng tùy ý bằng tham chiếu thay vì theo giá trị - để ngăn việc truyền giá trị có thể tốn kém hoặc không thể
void PrintIt(Object const& obj) {
// ...
}