繁体   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