操控器是什麼
std::cout << std::endl;
此句代碼中std::endl
爲操控器,操控器是用來操控stream對象的,常常只會改變輸入或格式化輸出的解釋方式。
std::cout << std::endl
:輸出’\n’,並刷新output緩衝區std::cout << std::ends
:輸出’\0’std::cout << std::flush
:刷新output緩衝區std::cin >> std::ws >> strTemp
: 讀入並忽略空格
其中std::ws格外給個測試例子(^-^)
//ws是一次性的,執行了任意格式化io操作後,就恢復默認值
char strTemp[16] = { 0 };
std::cin >> std::ws;
while( std::cin.getline( strTemp, sizeof(strTemp) ) )
{
cout << strTemp << endl;
std::cin >> std::ws;
}
操控器運行原理
操控器是一個特定格式的函數,而stream以這個特定格式函數爲參數重載了相應的格式操作符<< 、>>。如std::cout << std::endl;
,操作符執行時,碰到std::endl,則以參數std::endl調用相應的<<重載函數(此處叫操控器)。
operator<<實現代碼片斷:
_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
{ // call basic_ostream manipulator
_DEBUG_POINTER(_Pfn);
return ((*_Pfn)(*this));
}
endl的實現代碼片斷:
template<class _Elem,
class _Traits> inline
basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{ // insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
自定義操控器
知道了操控器的運行原理,只要按其格式寫個函數就行,以下是個輸出hello的操控器例子
template<class T, class traits>
inline basic_ostream<T, traits>& out_hello(basic_ostream<T, traits>& os )
{
char szTemp[] = "hello";
os.write( szTemp, sizeof(szTemp) );
return os;
}
int main()
{
cout << out_hello << endl;
return 0;
}