Article View: net.lang.c++
Article #147ReRe: static members
From: nathan
Date: Sat, 05 Apr 1986 22:30
Date: Sat, 05 Apr 1986 22:30
69 lines
3487 bytes
3487 bytes
Regarding: Re: initializing static members
>> With the restriction that no initializer may be provided for the field
>> ... and that no constructor may be provided for the class containing it,
>> the problem begins to look interesting.
>You've misinterpreted the C++ book. Section 8.5.1 in the reference
>manual says , "No initializer can be specified for a static member,
>and it cannot be of a class with a constructor."
I'm in good company. The book is not exactly a model of clarity on this
point. I reread the sentence for 10 minutes to figure out what the "it"
referred to; maybe I'm stupid. It finally dawned that "it", the
static member, may itself be an object of a class, and *that*
class can't have constructors.
> The reason for this restriction should be clear: when would the
> constructor for the static member be called? The beginning of execution
> would make sense ... but that may be a bit much to ask of the compiler.
I think not. The compiler handles all the other pre-main initializations
just fine. This really is no different. The problem is syntactic:
declarations with initializers don't "fit", just as consts don't.
> ... one can initialize it without reference to any instance of the class
> using the class1::static_member syntax.
Oh? And where must this initialization appear? In the initialization
code for some *other* object, that's where.
It seems there really is no way to avoid something like this:
// in bleah.h
class bleah {
static int here;
friend class bleah_hack; // have to mess up the declaration.
public:
int Here() { return 100; }
}
// in bleah.c
class bleah_hack { bleah_hack() { bleah::here = bleah::Here(); }} b;
...
>> The member function Here() is pretending to be a
>> constant field, but it's not even a constant *expression* ...
>...it behaves almost like a constant ...
That's what I *said*. Look what happens to code like this:
int bl_vec[bleah::Here()]; // illegal
static int bl_h = bleah::Here(); // illegal
void bleah::f(int h = bleah::Here()) { ... } // illegal
Need I go on?
>> By the way, 'b' defaults to static, not extern; see r8.1.
>This last remark leads me to believe that you have out of date
>documentation. ...
I have pencilled in all of bs's corrections from the second edition of the
book. Are there additional language specifications elsewhere?
With strong type-checking, there's little reason *not* to make globals
default to static. I would call it a feature.
I suspect Dr. Stroustrup is beginning to regret allowing statics in
classes, with all the worm-cans opening. Perhaps an official word
on this subject (future handling of statics and consts in classes)
would be forthcoming from the Architect himself.
> Bill Hopkins ... ihnp4!druny!weh
Nathan C. Myers
orstcs!nathan
nathan@oregon-state
Technical Details
Message-ID:
<34200018@orstcs.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxn!ihnp4!hplabs!hp-pcd!orstcs!nathanShow Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: notesfiles Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxr!mhuxn!ihnp4!hplabs!hp-pcd!orstcs!nathan From: nathan@orstcs.UUCP (nathan) Newsgroups: net.lang.c++ Subject: ReRe: static members Message-ID: <34200018@orstcs.UUCP> Date: Sat, 5-Apr-86 17:30:00 EST Article-I.D.: orstcs.34200018 Posted: Sat Apr 5 17:30:00 1986 Date-Received: Wed, 9-Apr-86 22:39:27 EST Organization: Oregon State University - Corvallis, OR Lines: 69 Nf-ID: #N:orstcs:34200018:000:2826 Nf-From: orstcs!nathan Apr 5 14:30:00 1986