Quale di queste risposte riguardanti le funzioni non è corretta?

17

Quindi, mentre eseguivo alcune lunghe compilazioni, ho deciso di prendere il test generale C ++ su ODesk e ho trovato questa domanda.

Senonmisbaglio,dataladicitura(olasuamancanza)tuttidiquestipotrebberoessereveri.

a.

intFoo(){}intFoo(intbar){}

b.Bene,returnvoid;sarebbeerratosemanticamentemalefunzionipossonoovviamenteaverevoidtipidiritorno.

voidFoo(){}

c.Questaèladefinizionedifunzioniinline,sì.

D.Senzaentrareneldettagliodelposizionamentodeiseguentielementi,

typedefvoid(*Func)(int);Funcfunctions[2];voidFoo(intbar){}voidBar(intfoo){}functions[0]=&Foo;functions[1]=&Bar;

Inoltre,puoisemprefarloutilizzando lambdas e funtori .

e.

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

f.

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

g.

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

Non riesco a vedere dove questa domanda abbia una risposta veramente falsa . Mi manca qualcosa?

Inutile dire che ho finito il tempo e ho fallito il tutto. Credo di essere un programmatore C ++ male. : (

    
posta Qix 18.04.2014 - 01:51
fonte

4 risposte

21

Questa intera domanda è dubbia. La frase domanda implica la possibilità di scelte multiple, mentre i pulsanti radio indicano una singola scelta.

Inoltre, b è piuttosto sospetto, poiché le funzioni di vuoto non restituiscono nulla.

D è anche discutibile, per quanto ne so, non è possibile avere una serie di funzioni. Certo, puoi avere una serie di puntatori di funzioni, ma non è esattamente la stessa cosa.

    
risposta data 18.04.2014 - 02:05
fonte
10

Risposta c) è anche discutibilmente falso.

"Le funzioni inline vengono espanse durante la compilazione per evitare l'overhead di invocazione."

In primo luogo, il compilatore C ++ può ignorare il inline hint non espandendo affatto le funzioni.

In secondo luogo, la "ragione" dichiarata per fare espansione è una semplificazione eccessiva. In effetti, la vera ragione per fare l'espansione (o meno) è interamente nelle mani dello scrittore del compilatore.

    
risposta data 18.04.2014 - 04:40
fonte
7

c. This is the definition of inline functions, yes.

Non è del tutto giusto.
Nonostante il suo nome, la parola chiave inline non garantisce che una funzione sia in linea. L'unica cosa di cui puoi essere sicuro è che il compilatore non si lamenterà se vedrà la definizione di una funzione inline più volte.

Quindi, in senso stretto, l'opzione C non è corretta, ma non penso che sia la risposta che si aspettano gli autori del quiz, perché c'è una risposta che è ancora più sbagliata.

d. Without going into much detail about the placement of the following elements,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Further, you could always do this using lambdas and functors.

Nel tuo esempio, functions è una matrice di funzioni puntatori a e non una matrice di funzioni stesse. Allo stesso modo, lambda e funtori non sono realmente funzioni neanche. Sono classi che rispondono all'operatore di chiamata di funzione, ma questo non le rende funzioni agli occhi della definizione del linguaggio C ++.

Le funzioni in C ++ sono un po 'come i cittadini di seconda classe. Puoi definirli e chiamarli, ma non appena provi a fare qualcos'altro con un tipo di funzione (ad esempio, creane un array), ottieni un errore o si convertono automaticamente in un puntatore.

    
risposta data 18.04.2014 - 08:39
fonte
4

Se mai, dovrebbe essere b . Non puoi return a void , ma puoi restituire un null . Void sulla dichiarazione della funzione dovrebbe essere lì per notificare al compilatore la mancanza di un valore restituito.

Tipo non valido

In C and C++

A function with void result type ends either by reaching the end of the function or by executing a return statement with no returned value. The void type may also appear as the sole argument of a function prototype to indicate that the function takes no arguments. Note that despite the name, in all of these situations, the void type serves as a unit type, not as a zero or bottom type, even though unlike a real unit type which is a singleton, the void type is said to comprise an empty set of values, and the language does not provide any way to declare an object or represent a value with type void.

    
risposta data 18.04.2014 - 01:57
fonte

Leggi altre domande sui tag