簡體   English   中英

類對象的常量性如何影響該類的成員?

[英]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整數成員數據。

  • cfFoo類型的const對象,我們知道常量對象的成員本身是常量,所以為什么允許這樣做:

     std::cout << cf.*ptr << '\\n'; // why allowed?
  • cfvalue_現在是常量,因為cfconst那么為什么允許將指針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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM