Будет ли переменная выходить из области видимости, когда функция вернется? - PullRequest
1 голос
/ 08 сентября 2011
void main()
{
    File f;
    DoSomething(f);
    DoSomething2(&f);
}

void DoSomething(File& f)
{
    f.Process();
} // will f go out of scope when this function returns?

void DoSomething2(File* f);

Два вопроса:

  1. Как видно из комментария, f выйдет из области видимости после возврата из функции?
  2. Предлагаете ли вы написать функцию, используя ссылку или указатель?(Я говорю о частных функциях)

Ответы [ 6 ]

6 голосов
/ 08 сентября 2011
  1. f локальная ссылка на DoSomething выйдет из области видимости, но это, очевидно, не имеет последствий.

    f объект, локальный для main выходит из области видимости только после окончания main (что, кстати, должно быть int main.

    ToПодводя итог, ссылки являются псевдонимами к объектам, но исходные объекты сохраняют свою область действия, как это происходит с указателями.

  2. Обычно советуют использовать ссылки, когда это возможно, указатели, когдаВы должны .

    Обычно я использую ссылки всякий раз, когда мне нужно передать параметр - дух - для справки, и указатели, например, когда я хочу, чтобы этот параметр был необязательным 1 (указатели могут быть NULL), когда я принимаю массивы, ... и вообще, я бы сказал, когда в функции я собираюсь использовать указатель в качестве указателя ,не разыменовывать его все время.

  1. , хотя перегрузки и значения по умолчанию во многих ситуациях могут быть лучше, чем NULL.
3 голосов
/ 08 сентября 2011

f не выпадет из области видимости, поскольку является аргументом функции, т. Е. Не было создано внутри функции.

Желательно использовать ссылку, если это возможно, как естьгарантированно будет допустимой ссылкой, а не нулевой (да, она может быть нулевой, если вы используете какую-то хитрость и вызываете неопределенное поведение, но тогда ваша программа в любом случае недопустима).

1 голос
/ 08 сентября 2011

Scope - это концепция времени компиляции, а не концепция времени выполнения.Это относится к видимости имен, а не времени жизни объектов.

У вас есть три вещи с именем f.Один из них является локальным для main;остальные локальны для DoSomething и DoSomething2 соответственно.Для первых двух область действия (имени, а не объекта) распространяется на закрывающий }.

время жизни объекта с именем f, определенного в main продолжается до main возврата.Это единственный объект File в коде, который вы нам показали.

(И если вы не используете автономную (т.е. встроенную) реализацию, это int main(), а не void main(). Пожаловаться накто бы ни учил вас, что void main() правильно.)

0 голосов
/ 08 сентября 2011

Вопрос 1: вы передаете адрес файла и даете ему имя f (область действия которого - только функция DoSomething (& f). Вызов функции-члена объекта File никогда не повлияет наобласть видимости переменной f.

Sort Answer = no.

Вопрос 2: ссылки из моего понимания - это концепция Java, передача "ссылка" в C ++ выполненаотправив указатель объекта в качестве аргумента. Является ли передача указателя лучшим решением во многом зависит от того, что вы делаете.

Сортировать ответ = возможно?

0 голосов
/ 08 сентября 2011

Когда вы вызываете свою функцию «DoSomething», функция «что-то делать» получает ссылку на f, вызываемый из main.Это означает, что область действия f в main определяется от начала до конца main.«F.process» по своей природе не выходит за рамки.Он остается в области, определенной в main.

0 голосов
/ 08 сентября 2011

Конечно, нет, область действия f - это функция main.Он будет уничтожен, когда вернется main (то есть, когда ваша программа завершится).

Что касается вашего второго вопроса, ссылки всегда лучше (вставьте здесь соль), вы гарантированно никогда не будетеполучить null и синтаксис чище (мнение, я знаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...