2013-06-26 6 views
0

Некоторые из методов, которые я вижу в коде C++ являются этой структуры:Как передать параметры для вывода в C++

void Class::method1(int &a); 

и называются так:

int a; 
class->method1(a); 

Но иногда я вижу структуры как:

void Class2::method2(int* a); 

И эти методы называются так:

int a; 
class2->method2(&a); 

Я понимаю, что в первом случае метод принимает адрес переменной, а во втором - указатель на переменную, правильно?

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

Кроме того, в первом примере кажется, что метод может принимать «int & a» или «int a», и в обоих случаях мы будем называть его таким же образом: int a; class-> метод1 (а); ? Это кажется запутанным.

Спасибо.

+0

Просто, чтобы дать вам о чем подумать. Как вы думаете, что означает «int * &» или «int **»? В чем разница и где это может быть полезно. – dowhilefor

+0

во втором случае 'class2-> method2 (NULL);' допустимо. Это главное отличие. – andre

ответ

0

В первом случае метод принимает переменную reference. Это означает, что если a изменен внутри method1, он будет изменен после возвращения функции.

Во втором случае он принимает переменную pointer. Указатель - это адрес памяти переменной. Это то, что извлекает &: Адрес (он же указатель на a).

Оба типа имеют по существу одну и ту же цель: возможность изменять переменную различной области действия.

Смотрите, что пример:

void fooPointer (int* pointer) { 
    *pointer += 1; 
} 

void fooReference (int& reference) { 
    reference += 1; 
} 

int main() { 
    int a = 0; 

    std::cout << a; // Ouputs 0 

    fooPointer (&a); 
    std::cout << a; // Outputs 1 

    fooReference (a); 
    std::cout << a; // Outputs 2 
} 

Как вы можете видеть, как позволит вам сделать то же самое здесь. Но использование ссылок обычно проще и читабельнее, потому что все делается неявно, поэтому у вас нет reference (*) или dereference (&) ваших переменных.

+0

Так будет ли а изменено в другое время во втором случае? – user2199745

+0

См. Мой обновленный ответ. – Jerska

0

Первый вызван с использованием ссылки на переменную, второй - с помощью указателя. Между этими понятиями существует некоторая разница. Я рекомендую вам это сделать, но самые важные из них, о которых я могу сейчас думать, это то, что ссылка не может быть построена без указания на существующий объект и что указатель может быть NULL.

1
void Class::method1(int &a); 

Это проходит по ссылке.

void Class2::method2(int* a); 

Это передача указателя. В class2->method2(&a);, & - адрес оператора.

0

void Class::method1(int &a) означает, что вы проходите мимо a по ссылке, и вызывающий может ожидать, что a будет изменен.

void Class2::method2(int* a) означает, что вы проходите мимо a указателем, и вызывающий может ожидать, что вещь, на которую a точек, подлежащих изменению.

Лично мне не нравится проходить по ссылке, так как вызывающий не знает, будет ли a изменяться как синтаксис вызова для передачи по ссылке и передать по значению. Передача Постоянная ссылкаvoid Class::method1(const int &a) все еще с тех пор a не может быть изменен, и вы можете получить эффективность при отсутствии копий значений, если a - большой объект.

Однако многие люди отличаются своим мнением и говорят, что вам нужно передать указатель, если функция позволяет указателю быть нулевым; т. е. может ли ваша функция делать что-то полезное без ввода a?