Поэтому, пока я делал несколько длинных компиляций, я решил пройти общий тест C ++ на ODesk и наткнулся на этот вопрос.
Если я не ошибаюсь, учитывая формулировку (или ее отсутствие), все это может быть правдой.
а.
int Foo() { }
int Foo(int bar) { }
б.
Ну, это return void;
было бы неправильно семантически, но функции, очевидно, могут иметь void
возвращаемые типы.
void Foo() { }
с. Это определение встроенных функций, да.
д. Не вдаваясь в подробности о размещении следующих элементов,
typedef void (*Func)(int);
Func functions[2];
void Foo(int bar) { }
void Bar(int foo) { }
functions[0] = &Foo;
functions[1] = &Bar;
Кроме того, вы всегда можете сделать это, используя лямбды и функторы .
е.
void Foo(int& bar)
{
++bar;
}
int foobar = 5;
Foo(foobar);
е.
int bar = 5;
int& GetBar()
{
return bar;
}
GetBar() = 6;
грамм.
int bar = 5;
int* GetBar()
{
return &bar;
}
(*GetBar()) = 5;
Я не вижу, где на этот вопрос есть какие-то действительно ложные ответы. Я что-то пропустил?
Излишне говорить, что у меня не хватило времени и все провалилось. Думаю, я плохой программист на C ++. :(
Ответы:
Весь этот вопрос хитрый. Формулировка вопроса подразумевает возможность множественного выбора, в то время как переключатели указывают на один выбор.
Кроме того, b довольно подозрительно, поскольку функции void ничего не возвращают.
D также сомнителен, поскольку, насколько я знаю, у вас не может быть массива функций. Конечно, вы можете иметь массив указателей на функции, но это не одно и то же.
источник
int
. Конечно, если вы приведете его к указателю, и этот указатель ссылается на функцию ...void
функции не возвращают никакого значения , они по-прежнему возвращают типvoid
. Таким образом, я говорю, что Б правда.return void;
, но вместо этогоreturn;
.Ответ в) также возможно ложный.
«Встроенные функции расширяются во время компиляции, чтобы избежать накладных расходов при их вызове».
Во-первых, компилятору C ++ разрешено игнорировать
inline
подсказку, вообще не расширяя функции.Во-вторых, заявленная «причина» расширения - это упрощение. Фактически, настоящая причина для расширения (или нет) полностью находится в руках автора компилятора.
источник
inline
подсказку.Это не совсем верно.
Несмотря на название, ключевое слово
inline
не гарантирует, что функция будет встроенной. Единственное, в чем вы можете быть уверены, это то, что компилятор не будет жаловаться, если несколько раз увидит определение встроенной функции.Так что, строго говоря, вариант C неверен, но я не думаю, что это ответ, которого ожидают авторы теста, потому что есть ответ, который еще более неправильный.
В вашем примере
functions
это массив указателей на функции, а не массив самих функций. Точно так же лямбды и функторы на самом деле не являются функциями. Это классы, которые отвечают на оператор вызова функции, но это не делает их функциями в глазах определения языка C ++.Функции в C ++ немного похожи на граждан второго сорта. Вы можете определить и вызвать их, но как только вы попытаетесь сделать что-то еще с типом функции (например, создать их массив), вы либо получите ошибку, либо они молча преобразуют себя в указатель.
источник
c
как функции, которые уже были положительно помечены для встраивания, по сравнению сinline
самим ключевым словом. Я понимаюinline
, это намек.Во всяком случае, это должно быть б . Вы не можете , но вы можете вернуть . Пустота в объявлении функции должна быть там, чтобы уведомить компилятор об отсутствии возвращаемого значения.
return
void
null
Тип пустоты
источник
void
функции не возвращают никакого значения , они по-прежнему возвращают типvoid
. Таким образом, я говорю, что Б правда.