Unterschied: cout / printf

Ich beschäftige mich grad bissl damit C++ zu lernen und hab mir einige Tutorials angeschaut. Was mich verwirrt, ist dass manchmal cout<<"Hello World" und manchmal printf("Hello World") benutzt wird. Worin besteht denn eigentlich der Unterschied ?

P.S.: Sry für Noobfrage :D
 
Ich weiß nur das printf() eine Funktion von C ist und cout eine Funktion von C++, aber mehr weiß ich auch grad nicht.
/EDIT: 2 Min Googeln!
cout is an object of the iostream in C++. If you are using C++, then use cout, it works well.
printf while doing some the same things, it is a formatting function that prints to the standard out. This is mainly used in C
On the sidenote, since printf also does extra things there is overhead in speed of using it instead of cout, which simply outputs info.
The thing is, that C is still a dominant force in programming, and a lot of C programmer that program in C++ intermix C and C++. Although there are a lot of replacements for functions that are the standard way of doing thing with C in C++ it is still common to see C syntax in C++ programs because that is what most C programmers are comfortable with. It is just a preference.
This is still mainly a console/non-gui application style of programming. Most of the output in gui style applications use neither of these methods. (Although you might see quite a bit of sprintf)

Oder ganz genau:
printf() is a function...one designed to output formatted data to the screen. It is much faster than cout becasue cout is not a function...it is an object, one complete with many member methods and useful structures. The fact that cout is an object with these available members necessitates that it has more overhead that a function such as printf().

cout.bad(), cout.good(), cout.fail(), cout.setf(), cout.setstate(), and cout.clear() are just a few of the more than 30 members of the cout object that provide the user with enhanced functionality. To recreate this functionality with printf() would require separate functions for each corresponding member, and they would not be specifically made to work with the printf() function, but a more generic version.

Da düfte alles drinstehen.
 
Original von Chrizlybaer
Ok thx. Also wenn ich das richtig verstanden habe ist printf schneller, aber mit cout kann man mehr machen.

andersrum.
als faustregel kann man glaube sagen; man sollte immer die c++ methode waehlen wenn man die wahl hat. also z.b. auch std::string nehmen statt char*, exceptions statt ruckgabecodes, "konstante variablen" statt #define, usw.
 
cout, cin, etc...

Diese 'Dinge' sind sogenannte Streams.
Damit lässt sich später in hochentwickelten objektorientierten Code leichter Programmieren.
---

Meine lieblinge sind trotzdem printf und scanf Familien. ;)
 
Ich denke mal, daß der Unterschied darin liegt daß printf eine Funktion ist und cout ein Objekt der Klasse ostream:

in iostream kann man folgendes lesen:
extern ostream cout; ///< Linked to standart output

in ostream steht dann folgendes (in gekürzter Form):
template<typename _CharT, typename _Traits>
class basic_ostream : virtual public basic_ios<_CharT, _Traits>
{
public:
// Types (inherited from basic_ios (27.4.4)):
typedef _CharT char_type;
typedef typename _Traits::int_type int_type;
typedef typename _Traits::pos_type pos_type;

Das ist wohl einer der wirklich wichtigen Unterschiede. D.h. da C++ eine Objektorientierte Programmiersprache ist, sollte man versuchen mit "Objekten" zu arbeiten und nicht wie in C mit Daten und Funktionen, da man hierbei wirklich sehr viel erreichen kann und kaum Kontrolle über die Attribute (Variablen) und Methoden (Funktionen) hat.
 
Ok thx. Also wenn ich das richtig verstanden habe ist printf schneller, aber mit cout kann man mehr machen.

So ist es. Ich habe dazu nie Benchmarks gemacht, aber die Laufzeit ist trivial.

printf stammt aus der C Library, diese kann vollständig in C++ genutzt werden (unter C inkludiert man stdio.h, unter C++ nutzt man die cstdio). Diese Funktion gibt eine Zeichenkette standardmäßig auf stdout aus (printf ist äquivalent zu fprintf(stdout, "", ...).

cout wurde mit C++ eingeführt und ist ein Stream-Objekt. Es gibt die Zeichenketten ebenso standardmäßig auf stdout aus. Prinzipiell ist es egal ob du nun printf oder cout nutzt. cout hat aber einen entscheidenden Vorteil:
Du kannst in C++ Operatoren überladen und so zum Beispiel Folgendes machen:

Code:
class myClass {
    friend std::ostream &operator<<(std::ostream& ostr, myClass& mc); 

public:
    myClass(int value) {
        _i = value;
    }

private:
    int _i;
    
};

std::ostream &operator<<(std::ostream& ostr, myClass& mc) {
    return ostr << "Der Wert ist " << mc._i;
}
So, nun ist der Operator << überladen, wodurch Folgendes erlaubt wird:
Code:
int main() {
     myClass cl(5);
     std::cout << cl << std::endl;    // Ausgabe: 'Der Wert ist 5'
     return 0;
}

Unterm Strich ist es egal ob du nun die Old-School-C-Library nutzt, oder C++-Streams. Ich programmiere viel C/C++ und bin noch bei der C-Lib hängen geblieben, da ich das über die Zeit sehr stark verinnerlicht habe. Wenn du wirklich stark Wert auf Laufzeit legst, dann fährst du mit reinem C besser, aber IMHO kommt man nicht an Klassen vorbei, also kann ich einen reinen Einsatz von C nicht empfehlen.

Als ich angefangen habe zu programmieren, war mir der Unterschied zwischen C und C++ auch nicht ganz klar. Was ich dir da empfehlen kann, ist dich mit einer reinen C Lektüre zu begnügen (z.B. C von A bis Z, Galileo Openbook) und anschließend auf C++ umzusteigen (C++ von A bis Z ist zu empfehlen, aber leider nicht als Openbook erhältlich).

andersrum.
als faustregel kann man glaube sagen; man sollte immer die c++ methode waehlen wenn man die wahl hat. also z.b. auch std::string nehmen statt char*, exceptions statt ruckgabecodes, "konstante variablen" statt #define, usw.

Die std::strings sind IMHO fürn Arsch. Diese Dinger überlaufen ständig und werfen irgendwelche wirren Exceptions. Schreib dir 'ne eigene Klasse "String", dadurch lernst du auch direkt was ;)
Exeptions in C++ werden mir nicht konsequent genug eingesetzt. Außerdem erzeugen sie massig Overhead. Ich bin immer noch Freund von Rückgabewerten. An dieser Stelle muss ich Java loben, immerhin meckert der Compiler, wenn eine Ausnahme nicht gefangen wird.
Konstanten sind aber tatsächlich Defines vorzuziehen.
 
Zurück
Oben