Giriş
Şu satırı dahil etmek gerekir.
std::cout aslında bir ostream.Tanımlaması şöyle
Neden std::cout ve std::cerr Farklı
Açıklaması şöyle.
default constructor
Bu sınıfın default constructor metodu yoktur. Kullanmaya çalışırsak şu hatayı alırız.
Bu sınıfın default constructor metodu yoktur. Ancak şöyle yapılabilir. Aşağıdaki sınıf aynı rfbuf nesnesini kullanır.
assignment operator
Bu sınıfın assignment operator metodu yoktur. Kullanmaya çalışırsak şu hatayı alırız.
Error flag'leri good yapmak için şöyle yaparız.
Yeni bir locale + facet yaratmak için şöyle yaparız.
Şöyle yaparız.
Açıklaması şöyle
member operator << metodlar
cout için hem member "operator <<" hem de free style "operator <<" metodları var.
Üye "operator <<" metodları tek parametre alıyor. Üye olanların imzaları şöyle.
bool değişkeni stream'e yazar.
Örnek
Şöyle yaparız
double değişkeni stream'e yazar. İmzası şöyle.
Şöyle yaparız
pointer değişkenin adresini stream'e yazar. member operatörün imzası şöyle.
Elimizde şöyle bir kod olsun.
Örnek - redirect stdout to stderr
Şöyle yaparız.
Free style operator << metodların imzaları şöyle.
Açıklaması şöyle.
Şu satırı dahil etmek gerekir.
#include <iostream>
ostream sınıfı bir typedef'ten ibaret.typedef basic_ostream<char> ostream;
std::cout Nedirstd::cout aslında bir ostream.Tanımlaması şöyle
extern std::ostream cout;
Açıklaması şöyle.std::cout and std::cin are global objects of classes std::ostream and std::istream respectively, which they've overloaded operator << and >>.Dolayısıyla std::ostream sınıfının tüm metodlarını kullanmak mümkün.
Neden std::cout ve std::cerr Farklı
Açıklaması şöyle.
One of the most amusing and unexpected consequences of phototypesetting was the Unix standard error file (!). After phototypesetting, you had to take a long wide strip of paper and feed it carefully into a smelly, icky machine which eventually (several minutes later) spat out the paper with the printing visible.One afternoon several of us had the same experience -- typesetting something, feeding the paper through the developer, only to find a single, beautifully typeset line: "cannot open file foobar" The grumbles were loud enough and in the presence of the right people, and a couple of days later the standard error file was born...
Bu sınıfın default constructor metodu yoktur. Kullanmaya çalışırsak şu hatayı alırız.
copy constructor'std::basic_ostream>': no appropriate default >constructor available
Bu sınıfın default constructor metodu yoktur. Ancak şöyle yapılabilir. Aşağıdaki sınıf aynı rfbuf nesnesini kullanır.
struct cloned_ostream : std::ostream {
cloned_ostream( std::ostream const & in )
: std::ostream( in.rdbuf() ) {
copyfmt( in );
clear( in.rdstate() );
}
};
Böylece bir stream'in kısa ömürlü bir kopyası yaratılabilir. Bu kısa ömürlü kopya aynı rdbuf nesnesine yazdığı için formatlama işlemlerinde kullanılabilir.
std::ostream & operator << ( std::ostream & os, foo const & smth ) {
cloned_ostream cs( os );
cs << std::hex << smth.num;
// os is not switched to hexadecimal, which would be a confusing side-effect
return os;
}
Bu sınıfın assignment operator metodu yoktur. Kullanmaya çalışırsak şu hatayı alırız.
clear metodufunction "std::basic_ostream<...>::operator=(const std::basic_ostream<...>::_Myt &) ... cannot be referenced -- it is a deleted >function
Error flag'leri good yapmak için şöyle yaparız.
std::ostream request_stream = ...;
request_stream << "...";
...
request_stream.clear();
getloc metoduYeni bir locale + facet yaratmak için şöyle yaparız.
std::locale(std::cout.getloc(), myfacet);
operator void* - C++98Şöyle yaparız.
ostream m_stream = ...;
if(m_stream != NULL){
...
}
operator bool - C++11Açıklaması şöyle
Before C++11, std::ostream could be implicitly converted to void* via operator void*(), which returns a null pointer if error has occurred on the stream.Bu metod aslında şuna eşit.
Since C++11 the conversion function was changed to explicit operator bool(), which returns false if error has occured. Note the function is declared as explicit, which means implicit conversion to bool is not allowed,
if (!m_stream.fail()) {
...
}
Şöyle yaparız.if (m_stream) {
...
}
Şöyle yaparız.std::ostream s = ...;
if (!s)
std::cout << "Failed to open file" << std::endl;
cout için hem member "operator <<" hem de free style "operator <<" metodları var.
Üye "operator <<" metodları tek parametre alıyor. Üye olanların imzaları şöyle.
basic_ostream& operator<<( short value );
basic_ostream& operator<<( unsigned short value );
basic_ostream& operator<<( int value );
basic_ostream& operator<<( unsigned int value );
basic_ostream& operator<<( long value );
basic_ostream& operator<<( unsigned long value );
basic_ostream& operator<<( long long value );
basic_ostream& operator<<( unsigned long long value );
basic_ostream& operator<<( float value );
basic_ostream& operator<<( double value );
basic_ostream& operator<<( long double value );
basic_ostream& operator<<( bool value );
basic_ostream& operator<<( const void* value );
basic_ostream& operator<<( std::nullptr_t );
basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb);
basic_ostream& operator<<(
std::ios_base& (*func)(std::ios_base&) );
basic_ostream& operator<<(
std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
Üye metodları çağırmak için şöyle yaparızcout.operator<<(num);
operator << boolbool değişkeni stream'e yazar.
Örnek
Şöyle yaparız
bool c = ...;
std::cout << c <<"\n"; //the output is 1
operator << doubledouble değişkeni stream'e yazar. İmzası şöyle.
basic_ostream<charT, traits>& operator<<(double f);
ÖrnekŞöyle yaparız
double a = 12;
cout.operator<<(a); //works
operator << void *pointer değişkenin adresini stream'e yazar. member operatörün imzası şöyle.
std::ostream& operator<<( const void* value );
ÖrnekElimizde şöyle bir kod olsun.
struct Foo
{
int a;
int b;
int c;
};
Adresi yazdırmak için static_cast kullanmak gerekir. Şöyle yaparızprintf( "%p\n", &some_foo.c );
std::cout << static_cast<void*>{&some_foo.c} << '\n';
rdbuf metoduÖrnek - redirect stdout to stderr
Şöyle yaparız.
#include <iostream>
int main() {
std::cout << "to stdout\n";
std::cout.rdbuf(std::cerr.rdbuf());
std::cout << "to stderr\n";
}
Diğer - Free Style MetodlarFree style operator << metodların imzaları şöyle.
operator<<(cout, str);
operator << char
non-member olan bu metodun bir sürü parametre tipi için overload edilmiş hali var. char için imzası şöyle.
std::ostream& operator<<(std::ostream&, char const*);
template olarak düşünürsek char için imzası şöyle.template <class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
char ch );
operator << - function pointerAçıklaması şöyle.
İmzası şöyle.Calls func(*this);. These overloads are used to implement output I/O manipulators such as std::endl.
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
Hiç yorum yok:
Yorum Gönder