2017-10-18 5 views
-6
#include <iostream> 
#include <string> 
using namespace std; 

template <typename Type> 
const Type& GetMax(Type& value1,Type& value2) 
{ 
    if(value1 > value2) 
     return value1; 
    else 
     return value2; 
} 
template<typename Type> 
void DisplayComparison(const Type& value1,const Type& value2) 
{ 
    cout<<"GetMax("<<value1<<","<<value2<<") = "; 
    cout<<GetMax(value1,value2)<<endl; 
} 
int main() 
{ 
    int Int1 = -102, Int2 = 2001; 
    DisplayComparison(Int1,Int2); 

    double d1 = 3.14,d2 = 3.1416; 
    DisplayComparison(d1,d2); 

    string Name1("Jack"),Name2("John"); 
    DisplayComparison(Name1,Name2); 

    return 0; 
} 

const Type& GetMax ... ist const notwendig? Wenn ja warum? und wenn ich so schreibe ->const Type& GetMax(const Type& value1,const Type& value) was die beiden const tun? :(Warum müssen wir const am Anfang der Funktion GetMax setzen?

+4

All dies und mehr wird in jedem [gutes C++ Buch] erklärt (https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – UnholySheep

+0

Das 'const' ist nicht Qualifizierung der Funktion selbst. Es qualifiziert den Rückgabetyp. Dasselbe gilt für das Potential "const", das Sie für diese Parameter angeben, sie würden den Typ dieser Parameter qualifizieren. Mitgliedsfunktionsqualifizierer kommen am Ende, wie 'void foo() const'. –

+0

Du bist zu verkomplizieren es, nur zurückgeben '' und nicht die Baumuster zur const Type & ' – acraig5075

Antwort

0

Ich werde ein paar Punkte zu konst weiter setzen, so dass es klar ist, wann und was Sie verwenden können je nach Bedarf:

Fall 1: GetMax(const Type value1)

Hier Wert1 ist eine lokale Kopie, ich kann

von ein paar Punkte denken

ich von ein paar Gründe denken kann:

1) Wenn jemand den Code liest und sehen const Type value1, sie wissen, dass value1 nicht im Körper modifiziert werden die Funktion.

2) Der Compiler wird Ihnen sagen, wenn Sie versuchen, value1 im Körper der Funktion zu ändern. Daher kann das Hinzufügen von const Fehler verhindern.

3) Allerdings gibt es einen weiteren Unterschied in C++ 11. Ein konstantes Objekt kann nicht verschoben werden, da eine Verschiebeoperation das Objekt ändert. Daher können Sie nur eine Kopie von value1 in der Funktionskörper machen und kann nicht von ihr bewegen.

4) Auch wenn dies ein Klassentyp ist, können Sie Funktionen auf ein konstantes Objekt nicht nennen Nicht-const Mitglieder können.

Fall 2: GetMax(const Type& value1)

Wir wissen nicht, wie value1 außerhalb der Funktion verwendet wird, so wollen wir es bewahren, verändert.

Fall 3: const Type& GetMax()

Gespräch über die const vor der Funktion, bedeutet dies einen const Bezug auf Type (hier GetMax) zurückkehren

dieses Beispiel nehmen:

Class xyz; 
Type& t = xyz.GetMax()   //This is INCORRECT 
const Type& tc = xyz.GetMax() //This is OKAY! 

So, zusammenzufassen, nicht „verwenden müssen“ Sie nicht const, wenn Sie solche Anforderungen haben, wie oben erwähnt, obwohl es gute Praxis sein könnte ich tun so n ein paar Situationen.

Verwandte Themen