开发者

new object in c++

开发者 https://www.devze.com 2023-01-30 23:05 出处:网络
i\'m new to c++ programming and i will be happy if you can help me. i tried to write this code: bool RailwayLineList:: AddInTail(const RailwayLine& data)

i'm new to c++ programming and i will be happy if you can help me. i tried to write this code:

bool RailwayLineList:: AddInTail(const RailwayLine& data)
{
    //there is no linked list to add the element
    if(this==NULL)
        return false;
    RailwayLineLink 开发者_Go百科*newLink =  new RailwayLineLink(data);
}

when i tried to debug it i saw that the copy constructor had been called and the data had been initialized with some garbage (the class is using a default constructor).

why is the copy constructor being called?


A copy constructor is a constructor with a specific signature. It takes a single parameter, of const reference to the same type being constructed. So for a class Foo, the copy constructor looks like this:

Foo::Foo(const Foo&)

There are 2 other kinds of constructors: default and convert. The default constructor takes no parameters (or can be called as if it took no parameters, eg, all parameters have defaults):

Foo::Foo()

...and the convert destructor is basically anything else. For example:

Foo::Foo(const Bar&)

why is the copy constructor being called?

In your case, you're calling a RailwayLineLink constructor but passing in a const reference to a RailwayLine, so you're actually calling a convert constructor, not a copy constructor.

The convert constructor is called because you called it:

new RailwayLineLink(data);

This constructs a new RailwayLineLink object, passing data as the one and only parameter to the constructor.

If you have an empty convert constructor, that looks something like this:

RailwayLineLink::RailwayLineLink(const RailwayLine&)
{
}

...then all of the members of the new copy will be default constructed, and probably contain garbage.

Typically when you implement a copy constructor, you would want to do some kind of memberwise copy from the original to the copy, like this:

RailwayLineLink::RailwayLineLink(const RailwayLine& rhs)
: value_(rhs.value_)
{
}


if (this == NULL) is technically a valid construct but by the time it's reached, undefined behavior has been generated already if the statement could be true. DO NOT DO THIS!!!

0

精彩评论

暂无评论...
验证码 换一张
取 消