Ссылка на объект и указатель на объект - PullRequest
0 голосов
/ 13 октября 2011

Что происходит в случае конструктора копирования, если я использую указатель в параметре вместо ссылочной переменной?например

class MyClass
{
private: int a;
         char *str;
public:...
       ...
       MyClass(MyClass *pObj)
       {
          ....
          ....
       }
};

Ответы [ 3 ]

4 голосов
/ 13 октября 2011

MyClass (MyClass * pObj)

Является не конструктором копирования, это перегруженный конструктор .

Конструктор копирования принимает ссылку на тот же тип, что и аргумент.Пример:

MyClass (MyClass &)

Компилятор неявно создает конструктор копирования для вашего класса, если вы не предоставляете свою собственную версию.Этот конструктор копирования будет вызван, когда компилятору потребуется сгенерировать копию объекта.

Упомянутый выше перегруженный конструктор будет вызываться только при явном вызове.

Пример кода :

#include<iostream>

class MyClass
{
    private: int a;
             char *str;
    public:   
           MyClass(){}        
           MyClass(MyClass *pObj)
           {
               std::cout<<"\ninside *";
           }
           MyClass(MyClass &pObj)
           {
              std::cout<<"\ninside &";
           }    
           void doSomething(MyClass obj)
           {
               std::cout<<"\ndoSomething";
           }
};

int main()
{
      MyClass ob,ob2;
      MyClass obj2(&ob);   //Explicitly invoke overloaded constructor

      ob.doSomething(ob2); //Calls copy constructor to create temp copy of object
      return 0;
}

Обратите внимание, что вывод:

inside *
inside &
doSomething
1 голос
/ 13 октября 2011

По определению, конструктор копирования - это конструктор с константным ссылочным параметром для того же класса.Любое другое определение конструктора не является «конструктором копирования», поэтому он не будет вызываться компилятором, когда вы напишите что-то вроде:

MyClass x = y;

или

MyClass x( y );
0 голосов
/ 13 октября 2011

Конструктор копирования должен делать копию из объекта, а не из указателя.
Зачем передавать по ссылке, а не по значению?Потому что, если вы этого не сделаете, конструктор копирования перейдет к созданию копии аргумента, и это будет бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...