declaring a const instance of a class
Let's say I have a class defined as follows:
class foo{};
now, this is perfectly acceptable;
foo 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 follo开发者_如何学运维wing is valid:
const std::string f;
So what is missing from 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.
EDIT: please feel free to close it if it's stupid...
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;
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.
Consider the equivalence to int
:
int x; // legal
const int y; // illegal
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() { }
};
Now your const foo x;
code compiles.
Raising an error in the situation of an empty class is a known problem, and reported as issue #253.
const
, applied to a simple plain-old-data variable, indicates that that variable will not change in that context - so you aren't going to be able to reassign it to something. Therefore, you must initialize it or it will be perpetually uninitialized and thus useless.
I think there are more alternatives. You can do
const foo f={};
or
const foo f(());
Const means you can not assign to it later, so you have to initialize it. Since you did not define default constructor the compiler assumes it has to be initialized by you. std::string has default constructor so it is called implicitly by compiler.
精彩评论