程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++零基礎入門學習(cout/cin)

C++零基礎入門學習(cout/cin)

編輯:C++入門知識

 

C++編程語言互換流中的標准輸出流,需要iostream.h支持。讀為 "c out"。
目錄

使用范例
案例分析
技巧應用
cout控制符
其他信息
使用范例#include <iostream>
using namespace std;
int main()
{
int a;
cout<<"請輸入一個數字,按回車結束"<<endl;
cin>> a;
cout<<a<<endl;
return 0;
}
用戶輸入的數字由cin保存於變量a中,並通過cout輸出。
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello,World!"<<endl;
return 0;
} // Hello World 示例
案例分析由於以前學過C,所以這段代碼的其它部分在我看來都還算“正常”,然而cout卻很獨特:既不是函數,似乎也不是C++特別規定出來的像if,for一類有特殊語法的“語句”。由於只是初步介紹,所以那本書只是簡單的說cout是C++中的“標准輸入輸出流”對象……這於我而言實在是一個很深奧的術語。這還沒完,之後又遇見了cin……因為不知底細,從此使用它們的時候都誠惶誠恐,幾欲逃回C時代那簡明的printf(),畢竟好歹我可以說:我在調用的是一個函數。那有著一長串<<、>>的玩意,究竟算怎麼回事呢?我一直想把它們當作關鍵字,可偏偏不是,而且居然是用C++語言“做”出來的,呵!但printf()用多了就開始有人好心地批判我的程序“C語言痕跡過重”……
後來隨著學習的深入,總算大概明白了cout/cin/cerr/...的鬼把戲:那些東東不過是變著法兒“哄人”,其實說到底還是函數調用,不過這函數有些特殊,用的是運算符重載,確切地說(以下還是以cout為例)是重載了“<<”運算符。我們現在就讓它現出函數的本來面目,請看HelloWorld!的等效版本:
#include <iostream>
using namespace std;
int main()
{
cout.operator<<("Hello,World!");
cout.operator<<(endl);
return 0;
}
編譯運行,結果與經典版無二。上面程序應該更容易理解了:cout是一個iostream類的對象,它有一個成員運算符函數operator<<,每次調用的時候就會向輸出設備(一般就是屏幕啦)輸出東東。嗯,這裡有一個問題:為什麼函數operator<<能夠接受不同類型的數據,如整型、浮點型、字符串甚至指針,等等呢?
我想你現在已經猜到了,沒錯,就是用運算符重載。運算符函數與一般函數基本無異,可以任意重載。標准庫的設計者們早已經為我們定制了iostream::operator<<對於各種C++基本數據類型的重載版本,這才使得我們這些初學者們一上來就享受到cout<<"Hello,World!"<<endl;
cout.operator<<("Hello,World!").operator<<(endl);
才算“強等效”。究竟可不可以這樣寫?向編譯器確認一下……OK,NoProblem!
技巧應用嗯,我們已經基本上看出了cout的實質,現在不妨動動手,自己來實現一個cout的簡化版(Lite),為了區分,我們把我們設計的cout對象命名的myout,myout對象所屬的類為MyOutstream。我們要做的就是為MyOutstream類重載一系列不同類型的operator<<運算符函數,簡單起見,這裡我們僅實現了對整型(int)與字符串型(char*)的重載。為了表示與iostream斷絕關系,我們不再用頭文件iostream,而使用古老的stdio中的printf函數進行輸出,程序很簡單,包括完整的main函數,均列如下:
#include//在C和一些古老的C++中是stdio.h,新標准為了使標准庫
//的頭文件與用戶頭文件區別開,均推薦使用不用擴展名
//的版本,對於原有C庫,不用擴展名時頭文件名前面要加c
class MyOutstream
{
public:
const MyOutstream& operator<<(int value)const;//對整型變量的重載
const MyOutstream& operator<<(char* str)const;//對字符串型的重載
};
const MyOutstream& MyOutstream::operator<<(int value)const
{
printf("%d",value);
return *this;//注意這個返回……
}
const MyOutstream& MyOutstream::operator<<(char*str)const
{
printf("%s",str);
return *this;//同樣,這裡也留意一下……
}
MyOutstream myout;//隨時隨地為我們服務的全局對象myout
int main()
{
int a=2003;
char* myStr="Hello,World!";
myout<<myStr<<"\n";
return 0;
}
我們定義的myout已經初具形態,可以為我們工作了。程序中的注釋指出兩處要我們特別注意的:即是operator<<函數執行完畢之後,總是返回一個它本身的引用,輸出已經完成,為何還要多此一舉?
還記得那個有點奇異的cout.operator<<("Hello,World!").operator<<(endl)麼?它能實現意味著我們可以連著書寫
cout<<"Hello,World!"<<endl;
而不是
cout<<"Hello,World!";
cout<<endl;
為何它可以這樣連起來寫?我們分析一下:按執行順序,系統首先調用cout.operator<<("Hello,World!"),然後呢?然後cout.operator<<會返回它本身,就是說在函數的最後一行會出現類似於return *this這樣的語句,因此cout.operator<<("Hello,World!")的調用結果就返回了cout,接著它後面又緊跟著.operator<<(endl),這相當於cout.operator<<(endl)——於是又會進行下一個輸出,如果往下還有很多<<算符,調用就會一直進行……哇噢,是不是很聰明?現在你明白我們的MyOutstream::operator<<最後一行的奧妙了吧!
再注意一下main函數中最激動人心的那一行:
myout<<"\n"
我們知道,最後出現的"\n"可以實現一個換行,不過我們在用C++時教程中總是有意無意地讓我們使用endl,兩者看上去似乎一樣——究竟其中有什麼玄妙?查書,書上說endl是一個操縱符(manipulator),它不但實現了換行操作,而且還對輸出緩沖區進行刷新。什麼意思呢?原來在執行輸出操作之後,數據並非立刻傳到輸出設備,而是先進入一個緩沖區,當適宜的時機(如設備空閒)後再由緩沖區傳入,也可以通過操縱符flush,ends,或unitbuf進行強制刷新:
cout<<"Hello,World!"<<"Flush the screen now!!!"<<flush;
這樣當程序執行到operator<<(flush)之前,有可能前面的字符串數據還在緩沖區中而不是顯示在屏幕上,但執行operator<<(flush)之後,程序會強制把緩沖區的數據全部搬運到輸出設備並將其清空。而操縱符endl相當於<<"\n"<<flush;
不過可能在屏幕上顯示是手動刷新與否區別看來都不大。但對於文件等輸出對象就不大一樣了:過於頻繁的刷新意味著老是寫盤,會影響速度。因此通常是寫入一定的字節數後再刷新,如何操作?靠的就是這些操縱符。
cout控制符控制符 描 述
dec 置基數為10
hex 置基數為16
oct 置基數為8
setfill(c) 設填充字符為c
setprecision(n) 設置實數的精度為n位
setw(n) 設域寬為n個字符
setiosflags(ios::fixed) 固定的浮點顯示
setiosflags(ios::scientific) 指數表示
setiosflags(ios::left) 左對齊
setiosflags(ios::right) 右對齊
setiosflags(ios::skipws) 忽略前導空白
setiosflags(ios::uppercase)16進制數大寫輸出
setiosflags(ios::lowercase)16進制數小寫輸出
其他信息C++的iostream家族
好了,說了這麼多,C++的iostream家族與C的printf/scanf家庭相比究竟有何優勢?首先是類型處理更安全、智能,想想printf中對付int、float等的"%d"、"%f"等說明符真是多余且麻煩,萬一用錯了搞不好還會死掉;其次是擴展性更強:我要是新定義一個復數類Complex,printf對其是無能為力,最多只能分別輸出實、虛部,而iostream使用的<<、>>操作符都是可重載的,你只要重載相關的運算符就可以了;而且流風格的寫法也比較自然簡潔,不是麼?CIN

C++編程語言互換流中的標准輸入流,需要iostream.h支持,及開始的時候,要有#include <iostream.h>(新版本編譯器為#include <iostream>)讀為 "see in",拼音"si yin",
cin代表標准輸入設備,使用提取運算符 ">>" 從設備鍵盤取得數據,送到輸入流對象cin中,然後送到內存。使用cin可以獲得多個從鍵盤的輸入值,其具體使用格式如下:
cin >> 表達式1 >>表達式2...>> 表達式n;
使用范例:
#include <iostream.h>
int main()
{
int a;
cout<<"請輸入一個數字,按回車結束"<<endl;
cin>> a;
cout<<a<<endl;
return 0;
}
用戶輸入的數字由cin保存於變量a中,並通過cout輸出。
#include <iostream>
using namespace std;
int main()
{
int a=ios_base::failbit;一般用ios_base::新式 ios::老式
cout<<a;
system("pause");
return 0;
}
/*
goodbit==0 無錯誤正常
badbit==1 有致命錯誤無法挽回
eofbit=2 文件結束
failbit=4 輸入錯誤 可以挽回 後面說明
*/
#include <iostream>
using namespace std;
int main()
{
int a,b;
cout<<"a:_\b";
cin>>a;//如輸入char 就會有多余的字符漏在緩沖區
1. cin.clear(); //恢復goodbit
cin.sync(); //清空緩沖區
2. cin.clear();
fflush(stdin);
3. cin.clear();
cin.ignore(次數,'需要結束的字符(這兒就是\n)') //一般次數取得足夠大 讓結束符起作用
cout<<"b:_\b";
cin>>b;
cout<<"a="<<a<<",b="<<b;
system("pause");
return 0;}
 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved