Установите две переменные:
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);
}
Или что-то как этот.
Да, в этом случае будет сделана копия. Если вы измените объявление функции следующим образом:
subline_t &subline(int x1, int x2, int id) {
, то копия не будет сделана. Однако в вашем конкретном случае было бы неверно возвращать ссылку на объект, размещенный в стеке. Проблема в том, что объект будет разрушен и признан недействительным до того, как вызывающая сторона сможет его использовать.
Это связано с общей Оптимизацией возвращаемого значения для C ++, которая может избежать выполнения фактической операции копирования в случай, который вы описали. Конечный результат будет (или должен быть) таким же, как если бы была сделана копия, но вы должны знать об оптимизации. Наличие этой оптимизации может в некоторых случаях изменить наблюдаемое поведение программы.
Да, для функции, объявленной для возврата структуры
, return
такой структуры скопирует ее (хотя компилятор уполномочен оптимизировать скопируйте, в основном в тех случаях, когда можно доказать, что оптимизация семантически безвредна, вы можете аргументировать «как будто» копирование было гарантировано).
Однако, поскольку вы пометили это как C ++, не C , почему бы вместо этого не снабдить вашу структуру struct
конструктором ...? Кажется яснее и прямее ...! -)
Он всегда будет возвращать копию .
Если вы хотите избежать снижения производительности при копировании объекта при возврате, вы можете объявить указатель, построить экземпляр объекта с помощью new и вернуть указатель. В этом случае указатель будет скопирован, а объект - нет.
В вашем случае он вернет копию
Если ваш код был
subline_t& subline(int, int)
, он вернет ссылку, которая приведет к неопределенному поведению.
да, возвращается копия
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
}
Восстановление объектов в 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
Он возвращает копию, что вы и хотите. Изменение его так, чтобы оно возвращало ссылку, приведет к неопределенному поведению в присвоении 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.
}
Для структуры subline_t
, которую вы определили, да, она всегда будет возвращать копию.
Просто к сведению, поскольку в этом случае вы используете только структуру (ure), это то же поведение, что и в языке C.
Хотя это функция языка, это рекомендуется не использовать