簡體   English   中英

如何訪問類的靜態const成員的地址?

[英]How to access the address of a static const member of a class?

該代碼不會編譯,並且錯誤信息是“ 未定義對`A :: a'的引用 ”:

代碼1:

#include <iostream>
using namespace std;

class A
{
public:
    static const int a=0;
};

int main()
{
    cout<<&A::a<<endl;
    return 0;
}

但是對於非常量靜態成員,它會編譯:

代碼2:

#include <iostream>
using namespace std;

class A
{
public:
    static int a;
};
int A::a=0;

int main()
{
    cout<<&A::a<<endl;
    return 0;
}

有沒有辦法訪問類的靜態const成員的地址? 如果有,怎么辦? 為什么代碼1無法編譯?

const int A::a;

在源文件中,否則編譯器不會為a生成地址。 注意,此處不重復該值。

該代碼無法編譯

該代碼不鏈接 ,但可以編譯。 如果要使用static const成員的地址,則需要一個定義 ,因此只需添加類似於第二個代碼片段的定義即可:

const int A::a;

取的地址A::a裝置A::aODR -二手,和從部分中的C ++ 11標准(草案n3337)的9.4.2靜態數據成員 ,第3:

如果非易失性const靜態數據成員是整數或枚舉類型 ,則其在類定義中的聲明可以指定大括號或相等初始化器,其中作為賦值表達式的每個初始化器子句都是一個常數表達式(5.19) 。 可以使用constexpr說明符在類定義中聲明文字類型的靜態數據成員; 如果是這樣,則其聲明應指定一個花括號或相等的初始化程序,其中每個作為賦值表達式的初始化程序子句都是一個常量表達式。 [注意:在這兩種情況下,成員都可能出現在常量表達式中。 — [end note] 如果在程序中使用了成員 (3.2),則該成員仍應在名稱空間范圍中定義,並且該名稱空間范圍定義不應包含初始化程序。

由於要獲取地址,因此仍然需要定義靜態成員,就像對非const版本所做的那樣:

int A::a;

對於const版本,您還需要

const int A::a;

請參閱此處進行良好的討論-標題引號“編譯時常量沒有地址”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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