2016-11-22 3 views
1

Прежде всего, извините за вопрос noob, поскольку я только что начал программировать на C++.C++ Copy Constructor для структуры, содержащей перечисление

У меня есть структура, определенный в заголовочном файле:

typedef struct DataStruct 
{ 
    double foo; 
    double foo1; 

    DataStruct::DataStruct() 
     : foo(0.0), foo1(0.0) 
    { 
    } 

} DataStruct; 

Тогда у меня есть функция в другой файл, который возвращает объект этой структуры после заполнения его значениями:

DataStruct SomeFile::SomeFunction(Foo foo) 
{ 
    DataStruct dataStruct; 

    double foo2 = 5.8; 
    DataStruct.foo = foo2; 

    double foo3 = 6.0; 
    DataStruct.foo1 = foo3; 

    return DataStruct; 
} 

I Я не уверен, что мне нужно создать конструктор копирования для этого. Если я должен, я не совсем уверен, где я должен его создать и как.

+3

Где перечисление? – juanchopanza

+2

Off topic: 'typedef struct DataStruct {...} DataStruct;' является левым с C. В C++ 'struct DataStruct {...};' достаточно. – user4581301

ответ

3

Вам не нужно определять собственный конструктор копирования для примера, который вы указали. Компилятор предоставит вам конструктор копии по умолчанию, который выполняет поэтапную копию значений структуры. Конструктор кодов по умолчанию достаточен, когда структура содержит только тривиальные типы данных и/или типы, которые определяют их собственные конструкторы копирования.

Только когда вам нужно управлять внешними ресурсами (например, файлами, динамически распределенной памятью и т. Д.), Когда вам действительно нужно обратить внимание на конструкторы копирования (см. Rule of Three).

Это, как говорится, если вы хотите, чтобы определить конструктор пользовательских копий, он будет выглядеть следующим образом:

struct DataStruct 
{ 
    double foo; 
    double foo1; 

    DataStruct() 
     : foo(0.0), foo1(0.0) 
    { 
    } 

    DataStruct(const DataStruct &src) 
     : foo(src.foo), foo1(src.foo1) 
    { 
    } 

    DataStruct& operator=(const DataStruct &rhs) 
    { 
     if (&rhs != this) 
     { 
      foo = src.foo; 
      foo1 = src.foo1; 
     } 
     return *this; 
    } 
}; 

При этом, учитывая пример вы показали, что компилятор может использовать Return Value Optimization так SomeFunction() делает не нужно делать копию возвращаемой переменной dataStruct (параметр Foo - это другое дело).

+0

Благодарим вас за разъяснение. – Jasmine