Как объекты передаются функциям C++ значением или ссылкой?

Информировать 7 . Пример правильной программы:

    Chomsky is a room. 
    A thought is a kind of thing. 
    Color is a kind of value. 
    The colors are red, green and blue. 
    A thought has a color. It is usually Green. 
    A thought can be colorful or colorless. It is usually colorless. 
    An idea is a thought in Chomsky with description "Colorless green ideas sleep furiously." 
    A manner is a kind of thing. 
    Furiously is a manner. 
    Sleeping relates one thought to one manner. 
    The verb to sleep (he sleeps, they sleep, he slept, it is slept, he is sleeping) implies the sleeping relation. 
    Colorless green ideas sleep furiously. 

Другие глупости, подобные этой Симулятор машины Тьюринга можно найти.

5
задан xan 8 February 2011 в 20:35
поделиться

8 ответов

poly значения будут скопированы в _poly , но вы сделаете дополнительную копию в процессе. Лучший способ сделать это - передать по ссылке const:

void polynomial::Set(const vector<int>& poly) {
    _poly = poly;                      
}

EDIT Я упоминал в комментариях о копировании и замене. Другой способ реализовать то, что вы хотите, -

void polynomial::Set(vector<int> poly) { 
    _poly.swap(poly); 
}

. Это дает вам дополнительное преимущество, заключающееся в наличии строгой гарантии исключения вместо базовой гарантии. В некоторых случаях код тоже может быть быстрее, но я считаю это большим плюсом. Единственное, что этот код можно назвать «более трудным для чтения», поскольку нужно понимать, что существует неявная копия.

13
ответ дан 18 December 2019 в 06:36
поделиться

Это сделает мелкую копию вектора целых чисел. Обычно это работает так, как вы ожидаете (_poly в конечном итоге будет содержать те же значения, что и poly).

Вы бы увидели странное поведение, если бы у вас были указатели (поскольку они копировались бы по значению).

В общем, вы можете передать этот параметр по ссылке const:

void polynomial::Set( const vector<int>& poly )

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

4
ответ дан 18 December 2019 в 06:36
поделиться

Это скопирует весь вектор. Присвоение по значению в C ++. Если вы назначаете указатель, присваивается значение указателя. Ссылки не могут быть переназначены для ссылки на другой объект после инициализации, поэтому их назначение изменяет объект ссылки.

2
ответ дан 18 December 2019 в 06:36
поделиться

Оператор копирования для векторов скопирует содержимое вектора.

2
ответ дан 18 December 2019 в 06:36
поделиться

Да, указанная вами линия копирует весь вектор. Кроме того, при вызове функции также будет копия, поскольку это не const.

Обычно, если вектор имеет какой-либо размер, это ОЧЕНЬ дорого.

0
ответ дан 18 December 2019 в 06:36
поделиться

Ваш вектор будет скопирован.

На самом деле происходит то, что оператор "=" вектора был перегружен для фактического копирования.

1
ответ дан 18 December 2019 в 06:36
поделиться

Есть три возможности:

Передать по значению

void someFunction(SomeClass theObject);

Передать указатель

void someFunction(SomeClass *theObject);

Передать по ссылке

void someFunction(SomeClass &theObject);
2
ответ дан 18 December 2019 в 06:36
поделиться

Если вы не назначаете или не передаете параметр по ссылке (с использованием префикса &), вы передаете его по значению. Для классов это означает, что копия объекта создается с использованием либо предоставленного, либо неявно сгенерированного (неглубокого) конструктора копии для типа. Это может быть дорогостоящим и часто нежелательным.

В вашем примере вектор копируется дважды - один раз, когда он передается в качестве параметра методу Set (), и еще раз, когда он назначается члену _poly.

Вы можете избежать первой копии, передав вектор по ссылке:

void polynomial::Set(const vector<int>& poly) // passes the original parameter by reference
{
    _poly = poly; // still makes a copy
}
0
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

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