2015-10-03 2 views
-1

У меня есть концептуальный вопрос, который поможет мне как начинающему программисту на C++. В чем преимущество, если таковое имеется, на C++, позволяющем смешивать или «смешивать» объявления и исполняемые файлы? Как я начинаю, все, о чем я могу думать, это то, что это не функция, доступная в C. И, очевидно, вы можете комбинировать некоторые строки кода, не имея необходимости объявлять переменные в начале определенной области, но вы можете объявить в самой инструкции. Хотел бы я рассказать вам все, но я действительно не знаю. Может быть, толчок в правильном направлении поможет! Благодаря!C++ смешение объявлений переменных и исполняемых файлов advtantage

+1

Я не понимаю. Под «исполняемыми файлами» вы на самом деле означаете не декларативные заявления? Вы спрашиваете, почему C++ позволяет нам объявлять переменные в точках, отличных от вершины функции? –

+1

FWIW, C99 удалил это ограничение от C. Это было 16 лет назад. –

+1

http://stackoverflow.com/q/4075246/560648 –

ответ

0

Это ТРЕБУЕТСЯ в случаях, когда вам нужно взять ссылку на результат функции.

SomeType& func(); 
.... 

... 
    ... Some code that is needed to make `func` work, for example 
    ... opening a file or initializing some global variables. 
    SomeType& x = func(); 
... 

Это не работает, чтобы объявить x в начале блока, как С предварительно С99 требует в данном случае, так как ссылки не могут быть объявлены без инициализации referant в качестве ссылки.

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

SomeType x(func()); 

бы избежать вызова конструктора по умолчанию SomeType.

Но, как правило, компилятор позаботится о том, чтобы удалить ненужные конструкторы, поэтому вопрос гораздо меньше, чем в первом случае.

0

Главное преимущество - сделать код более удобным для чтения - вместо того, чтобы иметь оператор, такой как myVar = doSomething(p1, p2, p3);, и ему нужно прокрутить весь путь до начала области, чтобы вспомнить, что такое myVar, у вас может быть один, более четкий, один подкладка MyClass myVar = doSomething(p1, p2, p3);.

+1

И тогда вы можете полностью разрушить его, написав 'auto myVar = doSomething (p1, p2, p3)', потому что вам слишком ленив, чтобы использовать систему типов :( –

0

Здесь по крайней мере три преимущества/преимущества. не

нет неинициализированных/по умолчанию инициализируются значений и лучше обзорного

int a = -1; 
int b; 
... // Use of `a` is meaningless here, use of `b` is also dangerous 
a = f(); b = g(); 

против

... // Uses of `a` and `b` are compiler errors 
int a = f(), b = g(); 

более эффективного создания объекта

Object o;    // default ctor 
... 
o = Object(1, 2, 'a'); // ctor + move-assignement operator 

против

... 
Object o(1, 2, 'a');  // ctor 

RAII

mtx.lock(); 
... 
mtx.unlock();  

против

{ 
    std::lock_guard<mutex> guard(mtx); // implicit mtx.lock() 
    ... 
} // automatically generated mtx.unlock(); 
Смежные вопросы