copy-initialization and class object as static member

S

subramanian100in

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::eek:bj = 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::eek:bj = 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
 
M

Michael DOUBEZ

(e-mail address removed), 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::eek:bj = 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::eek:bj = 9;

This is equivalent to
Base Base::eek:bj(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
 
T

Tadeusz B. Kopec

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::eek:bj = 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::eek:bj = 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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,965
Messages
2,570,148
Members
46,710
Latest member
FredricRen

Latest Threads

Top