Делает значения копии оператора возврата

Установите две переменные:

DateTime lowValue = DateTime.Parse("1/1/2009");
DateTime highValue = DateTime.Parse("12/31/2009");

Затем добавьте день к низкой стоимости, пока это не будет равно highvalue:

while (lowValue <= highValue)
{
   //Do stuff here
   lowValue = lowValue.AddDays(1);
}

Или что-то как этот.

65
задан Lightness Races with Monica 2 January 2012 в 00:52
поделиться

9 ответов

Да, в этом случае будет сделана копия. Если вы измените объявление функции следующим образом:

subline_t &subline(int x1, int x2, int id) {

, то копия не будет сделана. Однако в вашем конкретном случае было бы неверно возвращать ссылку на объект, размещенный в стеке. Проблема в том, что объект будет разрушен и признан недействительным до того, как вызывающая сторона сможет его использовать.

Это связано с общей Оптимизацией возвращаемого значения для C ++, которая может избежать выполнения фактической операции копирования в случай, который вы описали. Конечный результат будет (или должен быть) таким же, как если бы была сделана копия, но вы должны знать об оптимизации. Наличие этой оптимизации может в некоторых случаях изменить наблюдаемое поведение программы.

43
ответ дан 24 November 2019 в 15:32
поделиться

Да, для функции, объявленной для возврата структуры , return такой структуры скопирует ее (хотя компилятор уполномочен оптимизировать скопируйте, в основном в тех случаях, когда можно доказать, что оптимизация семантически безвредна, вы можете аргументировать «как будто» копирование было гарантировано).

Однако, поскольку вы пометили это как C ++, не C , почему бы вместо этого не снабдить вашу структуру struct конструктором ...? Кажется яснее и прямее ...! -)

3
ответ дан 24 November 2019 в 15:32
поделиться

Он всегда будет возвращать копию .

Если вы хотите избежать снижения производительности при копировании объекта при возврате, вы можете объявить указатель, построить экземпляр объекта с помощью new и вернуть указатель. В этом случае указатель будет скопирован, а объект - нет.

3
ответ дан 24 November 2019 в 15:32
поделиться

В вашем случае он вернет копию

Если ваш код был

subline_t& subline(int, int)

, он вернет ссылку, которая приведет к неопределенному поведению.

4
ответ дан 24 November 2019 в 15:32
поделиться

да, возвращается копия

subline_t subline(int x1, int x2, int id) {
        subline_t t = { x1, x2, id };
        return t;
}

Если вы поместите ссылку, то это не копия

subline_t & subline(int x1, int x2, int id) {
        subline_t t = { x1, x2, id };
        return t; // will result in corruption because returning a reference
}
2
ответ дан 24 November 2019 в 15:32
поделиться

Восстановление объектов в C ++ выполняется по значению, а не по ссылке.

ссылка на subline_t t выходит за рамки

Нет , объект копируется.

всегда будет копировать оператор return

Да, а не ... Семантически он ведет себя как копия, но есть кое-что, что называется оптимизацией возвращаемого значения, которая сохраняет конструктор копирования.

foo make_foo()
{
    foo f(1,2,3);
    return f;
}

foo ff=make_foo(); /// ff created as if it was created with ff(1,2,3) -- RVO
foo ff2;
ff2=make_foo(); /// instance of foo created and then copied to ff2 and then old
                /// instance destroyed
1
ответ дан 24 November 2019 в 15:32
поделиться

Он возвращает копию, что вы и хотите. Изменение его так, чтобы оно возвращало ссылку, приведет к неопределенному поведению в присвоении line.

Однако идиоматический способ сделать это в C ++ - с конструкторами и списками назначений. Это лучше инкапсулирует код и структуры данных, и позволяет избежать множества промежуточных объектов, которые компиляторы могут создавать / уничтожать / копировать.

struct subline_t {
        int x1;/*top*/
        int x2;/*bottom*/
        int id;

// constructor which initialises values with assignment list.
  subline_t(int the_x1, int the_x2, int the_id) :
    x1(the_x1),
    x2(the_x2),
    id(the_id)
  {
  }
};


int main(){
    subline_t line2(0,0,0); // never requires a copy or assignment.
}
1
ответ дан 24 November 2019 в 15:32
поделиться

Для структуры subline_t , которую вы определили, да, она всегда будет возвращать копию.

0
ответ дан 24 November 2019 в 15:32
поделиться

Просто к сведению, поскольку в этом случае вы используете только структуру (ure), это то же поведение, что и в языке C.

Хотя это функция языка, это рекомендуется не использовать

-1
ответ дан 24 November 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: