[英]How the const-ness of a class object affects members of that class?
AFAIK 類類型的const
對象導致其所有成員也是const
。 指向普通對象的指針不能指向const
對象。
在這個例子中,我試圖理解指向類成員的指針:
struct Foo{
int value_ = 1024;
};
int main(){
int Foo::* ptr = &Foo::value_; // ptr is a pointer to any non-const non-static integer member data
Foo f;
++(f.*ptr);// ok
Foo const cf;
// ++(cf.*ptr); // error. OK
std::cout << cf.*ptr << '\n';
std::cout << "\ndone!\n";
}
正如你所看到的, ptr
是一個指向int
類型的類Foo
的非靜態非常量成員數據的指針,這意味着它不能指向一個const
整數成員數據。
cf
是Foo
類型的const
對象,我們知道常量對象的成員本身是常量,所以為什么允許這樣做:
std::cout << cf.*ptr << '\\n'; // why allowed?
cf
的value_
現在是常量,因為cf
是const
那么為什么允許將指針ptr
綁定到該常量成員數據?
指向類成員的指針是很少使用的特性,與普通指針有很大不同。
我看待這些指針的方式是,如果它們碰巧是公共成員,它們只是創建一個新名稱或訪問類成員的新方法。
使用指向 const 對象成員的指針,編譯器知道它當前指向的是 const 對象的成員。 只要您只訪問數據成員而不修改它,您就可以了。
如下修改您的情況,其中數據元素本身是一個常量,在這種情況下,您也可以讀取數據成員,但編譯器不允許您更改數據成員。 另外,請注意,您需要將類成員指針聲明為指向 const int。
struct Foo
{
const int value_ = 1024;
};
int main()
{
const int Foo::* ptr = &Foo::value_;
Foo f;
//++(f.*ptr);// Error
std::cout << f.*ptr << '\n'; //OK, works
Foo const cf;
// ++(cf.*ptr); // error. OK
std::cout << cf.*ptr << '\n';
std::cout << "\ndone!\n";
}
話雖如此,您應該很少會發現需要使用指向類數據成員的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.