By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,154 Members | 1,056 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,154 IT Pros & Developers. It's quick & easy.

copy-initialization and class object as static member

P: n/a
Consider the following program:

#include <iostream>

using namespace std;

class Base
{
public:
Base(int x = 0);

private:
Base(const Base & arg);

int val;
static Base obj;
};

Base::Base(int x) : val(x)
{
cout << "one arg ctor called" << endl;
}

Base::Base(const Base & arg) : val(arg.val)
{
cout << "copy ctor invoked" << endl;
}

Base Base::obj = 9;

int main()
{
Base x = 1; // copy-initialization

return 0;
}

Suppose the above program is named x.cpp

When I compile this program under g++ with
g++ -std=c++98 -pedantic -Wall -Wextra x.cpp

I get compilation error for the following line in main():
Base x = 1;

This is because the copy ctor is private and copy-initialization is
involved.
But I do not get this error for the line:
Base Base::obj = 9;

Why is the copy-initialization of class object as static member
treated
differently? I do not understand the difference.
Where I am going wrong ?

Kindly explain.

Thanks
V.Subramanian

Nov 13 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
su**************@yahoo.com, India a écrit :
Consider the following program:

#include <iostream>

using namespace std;

class Base
{
public:
Base(int x = 0);

private:
Base(const Base & arg);

int val;
static Base obj;
};

Base::Base(int x) : val(x)
{
cout << "one arg ctor called" << endl;
}

Base::Base(const Base & arg) : val(arg.val)
{
cout << "copy ctor invoked" << endl;
}

Base Base::obj = 9;

int main()
{
Base x = 1; // copy-initialization

return 0;
}

Suppose the above program is named x.cpp

When I compile this program under g++ with
g++ -std=c++98 -pedantic -Wall -Wextra x.cpp

I get compilation error for the following line in main():
Base x = 1;
This is equivalent to:
Base x(Base(1));

And since copy constructor is private, you get an error.
>
This is because the copy ctor is private and copy-initialization is
involved.
But I do not get this error for the line:
Base Base::obj = 9;
This is equivalent to
Base Base::obj(Base(9));

Here, since obj is a member of Base, it has access to private function
and can call copy constructor.
>
Why is the copy-initialization of class object as static member
treated
differently? I do not understand the difference.
Where I am going wrong ?

Michael
Nov 13 '07 #2

P: n/a
On Tue, 13 Nov 2007 04:09:04 -0800, su**************@yahoo.com, India
wrote:
Consider the following program:

#include <iostream>

using namespace std;

class Base
{
public:
Base(int x = 0);

private:
Base(const Base & arg);

int val;
static Base obj;
};
[snip]
Base Base::obj = 9;

int main()
{
Base x = 1; // copy-initialization

return 0;
}

Suppose the above program is named x.cpp

When I compile this program under g++ with g++ -std=c++98 -pedantic
-Wall -Wextra x.cpp

I get compilation error for the following line in main(): Base x = 1;

This is because the copy ctor is private and copy-initialization is
involved.
But I do not get this error for the line: Base Base::obj = 9;

Why is the copy-initialization of class object as static member treated
differently? I do not understand the difference. Where I am going wrong
?
Notice that the static member is also private. During initialisation of
static members you have the access to all private and protected data.

Also keep in mind that for initialisations like
Base x = 1;
the compiler is required only to check the accessibility of copy
constructor but is free to optimise away the call to it.

--
Tadeusz B. Kopec (tk****@NOSPAMPLEASElife.pl)
The road to Hades is easy to travel.
-- Bion
Nov 13 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.