Путаница в C ++ - PullRequest
       35

Путаница в C ++

5 голосов
/ 26 июня 2010

Я очень плохо знаком с C ++ и сейчас изучаю его.У меня есть несколько вопросов ..

  1. В чем разница между void DoSomething (const Foo & foo) и void DoSomething (Foo foo)? Если мы не укажем &, тогда экземпляр Foo будет передан по значению (не по ссылке).Это будет то же самое, что и аргумент const + & в аргументе, за исключением проверки во время компиляции.Итак, почему наличие const + & становится лучшей практикой по сравнению с аргументами без & и const?

    В C # передача объекта осуществляется «по ссылке», но, похоже, его нет в C ++.

  2. В книге, которую я читаю, сказано, что функции-члены передают неявный параметр по ссылке.

    Может ли кто-нибудь дать мне образец неявного параметра и по ссылке?Я знаю, что если мы хотим передать объект по ссылке, нам нужно использовать & (например, Foo (Person & p)), но почему C ++ передает объект по ссылке для неявного параметра?Я читал, что неявный параметр в C ++ похож на Contructor (строка str): strMemberVariable (str) {} ...

  3. Является ли массив единственным, который передается по ссылке в C ++?

  4. Почему я не могу использовать Foo fInstance в классе Foo?

Пример:

class Foo {

public:    
    Foo() { }

    Foo(const Foo& f) : fInstance(f) {   }  

    Foo fInstance;      
};

Заранее спасибо.

Ответы [ 12 ]

0 голосов
/ 26 июня 2010

В чем разница между void DoSomething (const Foo & foo) и void DoSomething (Foo foo)

DoSomething (Foo foo) передает объект foo по значению, если Foo является примитивомтип данных, но по ссылке, если Foo является определяемым пользователем типом данных.Но во втором случае, если вы измените foo, он отразится обратно на исходный объект, что часто нежелательно.Об этом позаботится DoSomething (const Foo & foo), который передает foo по ссылке (таким образом сохраняя дополнительную стоимость памяти при передаче по значению) и по-прежнему не предоставляет права на запись foo для функции DoSomething.Таким образом, это лучшая практика.

Может ли кто-нибудь дать мне образец неявного параметра и по ссылке?

Примером неявного параметра в функциях-членах является ссылкана родительский объект, т.е.this, который никогда не упоминается в определении функции, но всегда доступен для использования.

Является ли массив единственным, который передается по ссылке в C ++?

Нет,все определенные пользователем объекты передаются по ссылке.

0 голосов
/ 26 июня 2010
void DoSomething(Foo foo)

Фактически передает копию foo, а

void DoSomething(Foo& foo)

Передает ссылку на foo, поэтому, если вы измените foo в своей функции, вы измените исходный foo.Я надеюсь, что это имеет смысл.

Что касается массивов, массив на самом деле является указателем на начало массива, и этот указатель передается (весь массив не копируется).

array[5] = 0;//is the same as :
*(array+5) = 0; //this
...