声明一个类的 const 实例

declaring a const instance of a class(声明一个类的 const 实例)
本文介绍了声明一个类的 const 实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个定义如下的类:

Let's say I have a class defined as follows:

class foo{};

现在,这是完全可以接受的;

now, this is perfectly acceptable;

foo f;

这怎么会是编译器错误?(未初始化的 const ‘f’)

how come this is a compiler error? (uninitialized const ‘f’)

const foo f;

为什么我们必须这样做?

Why do we have to do this?

const foo f = foo();

我知道为什么我们不能这样做..

I know why we can't do this..

const foo f(); // though it compiles..

有趣的是,以下是有效的:

Interestingly, the following is valid:

const std::string f;

那么 foo 中缺少什么?

我知道那里有三个问题,而且形式不好,但我希望有人可以在一个答案中为我解决这个问题.

I realize that there are three questions there and it's bad form, but I'm hoping someone can clear this up for me in one answer.

如果它很愚蠢,请随时关闭它......

please feel free to close it if it's stupid...

推荐答案

你的类是一个 POD(本质上是因为它不提供默认构造函数).POD 变量在声明时初始化.也就是这个:

Your class is a POD (essentially because it doesn’t provide a default constructor). POD variables are not initialized upon declaration. That is, this:

foo x;

不会将 x 初始化为有意义的值.这必须单独进行.现在,当您将其声明为 const 时,这可能永远不会发生,因为您不能再分配或更改 x.

does not initialize x to a meaningful value. This has to be done separately. Now, when you declare it as const, this may never happen because you cannot assign to or change x any more.

考虑与 int 的等价性:

int x; // legal
const int y; // illegal

正如您所注意到的,使用 std::string 而不是 foo 可以编译.那是因为 std::string 不是 POD.一个简单的解决方案是为 foo 提供一个默认构造函数:

As you have noticed, using std::string instead of foo compiles. That’s because std::string is not a POD. A simple solution to your dilemma is to provide a default constructor for foo:

class foo {
public:
    foo() { }
};

现在你的 const foo x; 代码编译好了.

Now your const foo x; code compiles.

这篇关于声明一个类的 const 实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Rising edge interrupt triggering multiple times on STM32 Nucleo(在STM32 Nucleo上多次触发上升沿中断)
How to use va_list correctly in a sequence of wrapper functions calls?(如何在一系列包装函数调用中正确使用 va_list?)
OpenGL Perspective Projection Clipping Polygon with Vertex Outside Frustum = Wrong texture mapping?(OpenGL透视投影裁剪多边形,顶点在视锥外=错误的纹理映射?)
How does one properly deserialize a byte array back into an object in C++?(如何正确地将字节数组反序列化回 C++ 中的对象?)
What free tiniest flash file system could you advice for embedded system?(您可以为嵌入式系统推荐什么免费的最小闪存文件系统?)
Volatile member variables vs. volatile object?(易失性成员变量与易失性对象?)