Почему передача по ссылке в c ++ обозначается как functionName (dataType & variableName)? - PullRequest
0 голосов
/ 23 февраля 2019

в с ++.когда мы хотим определить переменную указателя, синтаксис будет:

dataType* pointerVariable = &variableName;

, что означает, что pointerVariable имеет тип dataType-pointer и хранит адрес variableName в памяти.Теперь, когда мы хотим определить функцию, которая принимает аргумент по ссылке, синтаксис:

void functionName( dataType& argumentName );

И когда мы хотим вызвать эту функцию, синтаксис:

functionaName( argumentName );

Мой вопрос: когда мы хотим определить функцию, которая получает аргумент по ссылке, что означает функцию, которая получает указатель в качестве аргумента, почему бы нам не использовать тот же синтаксис, который мы использовали для определения указателя, напримерследующее:

void functionName (dataType* argumentName);

И затем, когда мы хотим вызвать эту функцию, синтаксис будет:

functionName(&argumentName);

Почему новый синтаксис был определен?

1 Ответ

0 голосов
/ 23 февраля 2019

когда мы хотим определить функцию, которая получает аргумент по ссылке, что означает функцию, которая получает указатель в качестве аргумента

Есть ваша проблема: вы перепутали семантику с реализация .

Аргумент, который является ссылкой в ​​C ++, является аргументом, который является ссылкой.Вот и все, что касается C ++.Это ссылочный аргумент, и он ведет себя так, как стандарт говорит, что ссылочный аргумент ведет себя.

Реализация такой вещи в ABI, используемой компилятором, может включать передачу указателя.Но дело в том, что делает компилятор, а не в том, что происходит в модели C ++, определенной стандартом.

почему бы нам не использовать тот же синтаксис, который мы использовали для определения указателя

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

Указатель и ссылка - это не одно и то же.Переменные указателя могут указывать на разные объекты в разное время;ссылочные переменные не могут .Как только ссылка связана с объектом, она остается связанной с этим объектом, точка.

Указатели могут быть NULL.Ссылки не могут , или, по крайней мере, если вы делаете что-то, что создаст NULL-ссылку, вы вызываете UB, так что нет смысла говорить о поведении программы после этого.И т. Д.

Однако эта ссылочная переменная реализована внутри, это правила ссылок C ++, и компилятор должен их соблюдать.

...