2016-12-07 10 views
2

Вот мой код:запускается копия, но как?

#include <iostream> 
#include <cstring> 
using namespace std; 

class someClass{ 
    char * data; 
public: 
    someClass(const char * s){ 
     data = new char[strlen(s)+1]; 
     strcpy(data,s); 
     cout << "constructing.."<<endl; 
    } 

    someClass(const someClass &o){ 
     data = new char[strlen(o.data)]; 
     strcpy(data,o.data); 
     cout << "copy construction" << endl; 
    } 

    ~someClass(){delete [] data; cout << "destructing..." << endl;} 
    char * getValue(){return data;} 
}; 

void showValue(someClass o){ 
    char * s; 
    s = o.getValue(); 
    cout << s << endl; 
} 

int main(int argc, char ** argv){ 
    someClass str("Hello"), ptr("world"); 
    showValue(str); 
    showValue(ptr); 
} 

и выход:

constructing.. 
constructing.. 
copy construction 
Hello 
destructing... 
copy construction 
world 
destructing... 
destructing... 
destructing... 
  1. Теперь первые два 'построения ..' срабатывают, как только мы создаем объект в основной() в строке 1.

  2. showValue (str) запускается и запускает конструктор копирования для слова «привет». Как? После создания и временного объекта он разрушает себя, когда он не работает.

  3. showValue (ptr) запускается и запускает конструктор копирования для слова «мир». Как? После создания и временного объекта он разрушает себя, когда он не работает.

  4. И наконец, в обратном порядке наши объекты str и ptr уничтожаются.

Зачем копировать ctor? Я не отправил объект someClass в объект someClass. Можете ли вы объяснить мне ситуацию?

+2

Tangential, но стоит прочитать, если вы создаете конструкторы копирования: [Что такое правило трех?] (Http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – user4581301

ответ

4

Вы делаете копии, когда вы звоните

void showValue(someClass o) 

Если вы хотите, чтобы избежать копий, пройти по ссылке

void showValue(someClass const& o) 

В первом случае o является функцией локальной копии вашего someClass аргумента , который уничтожается в конце функции.

+0

Разве это не создает временный объект, когда мы передаем объект функции в качестве аргумента? –

+0

Это зависит от сигнатуры вашей функции. В ответе, который я опубликовал, первый метод создаст копию, второй метод не будет. – CoryKramer

2
void showValue(someClass o){ 
    char * s; 
    s = o.getValue(); 
    cout << s << endl; 
} 

эта часть вашего арчи вызывает конструктор копирования из someClass. Если вы хотите, чтобы избавиться от него, вы можете изменить свой класс:

void showValue(const someClass & o){ 
     char * s; 
     s = o.getValue(); 
     cout << s << endl; 
    } 

и изменить GetValue на:

char * getValue() const {return data;} 

Это называется проходя по константной-ссылки, в отличие от проходящих мимо (что вы делали). Когда вы передаете по значению, функция вызывает конструктор копирования вызываемого класса.

Изменение на getValue() предложил потому, что компилятор хочет быть уверен, что вызов getValue внутри showValue не будет изменять объекты члена константным элемента const someClass & o.

 Смежные вопросы

  • Нет связанных вопросов^_^