1. I/O流的常用控制符
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) 6進制數小寫輸出
setiosflags(ios::showpoint) 顯示小數點
setiosflags(ios::showpos) 正數前面加上正號
2.頭文件:*iostream.h* *iomanip.h* *stdlib.h*
cout/cin 流的控制符 exit(0)
3.指針的幾種類型:
int (*p)();p為指向函數的指針變量,該函數帶回一個整形值
int *p();p為帶回一個指針的函數,該指針指向整形數據
int (**)[n]p為一個指向一個指針變量的指針變量,被指向的指針變量指向一個含n個整形數據的一維數組
4.構造函數和析構函數特點及其區別:
a.構造函數可以有任意個形參,還可以重載(多個參數個數不同的函數);但析構函數不能有形參,因為是系統自動調用的.
b.構造函數不可以任意調用,只準系統調用;而析構函數不僅系統調用,也可以任意調用.
5.構造函數和析構函數什么時候自動運行?(例61)
構造函數:一般在定義類對象時自動運行.
析構函數:如果一個函數中定義了一個對象,則在這個函數運行結束時就執行一次;
當一個對象是使用NEW運算符被動態創建的,在使用DELETE運算符釋放它時,DELETE將會自動調用析構函數.
拷貝初始化構造函數:當用tpoint N(M);語句時調用一次;
當對象作為實參向形參傳遞時,即對形參初始化時執行一次;
當遇到M=return(N);語句,即對M進行初始化時調用一次;
6.this 指針用法:例63中,當程序執行語句list elem(i);時,系統對this指針進行了如下的缺省賦值:this=&list;
賦值成員函數舉例(此例在例63基礎上):
void Assign(linear_list&);//說明語句;
void linear_list::Assign(linear_list&p)
{if(&p==this)
return;
nmax=p.nmax;
nelem=p.nelem;
list=new int[nmax];
for(int i=0;i<nmax;i++)
list[i]=p.list[i];
}
7.const,volatile對象和const,volatile成員函數
格式:const person per/volatile person per;
int func(int) const;/char func(int) volatile;
說明:1.普通對象既可以訪問const對象,又可以訪問volatile對象;
2.const對象只能訪問用const修飾的成員函數;
volatile對象只能訪問用其所長volatile修飾的成員函數;
3.也可以同時說明為const volatile對象或const volatile成員函數;
const volatile對象只能訪問const volatile成員函數;
const/volatile對象也能訪問const volatile成員函數;
8.不同繼承方式的基類和派生類特性
------------------------------------------------
繼承方式 | 基類特性 | 派生類特性
------------------------------------------------
| public | public
公有繼承 | protected | protected
| private | 不可訪問
------------------------------------------------
| public | private
私有繼承 | protected | private
| private | 不可訪問
------------------------------------------------
| public | protected
保護繼承 | protected | protected
| private | 不可訪問
------------------------------------------------
A:幫助理解:1)對于公有繼承方式:
a.基類成員對其對象的可見性:公有成員可見,其他不可見。這里保護成員同于私有成員。
b.基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員。
c.基類成員對派生類對象的可見性:公有成員可見,其他成員不可見。
所以,在公有繼承時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數可以訪問基類中的公有成員和保護成員。這里,一定要區分清楚派生類的對象和派生類中的成員函數對基類的訪問是不同的。
2) 對于私有繼承方式:
a.基類成員對其對象的可見性: 公有成員可見,其他不可見。
b.基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見
c.基類成員對派生類對象的可見性:所有成員都是不可見的。
所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。
3) 對于保護繼承方式:
與私有繼承方式相同,兩者的區別僅在于對派生類的成員而言,對基類成員有不同的可見性。
B:幫助理解:1) 公有繼承時,水平訪問和垂直訪問對基類中的公有成員不受限制。
2) 私有繼承時,水平訪問和垂直訪問對基類中的公有成員也不能訪問。
3) 保護繼承時,對于垂直訪問同于公有繼承,對于水平訪問同于私有繼承。
4) 對于基類中的私有成員,只能被基類中的成員函數和友元函數訪問,不能被其他的函數訪問。
C:幫助理解:在公有繼承時,派生類的成員函數可訪問基類中的公有成員和保護成員;派生類的對象僅可訪問基類中的公有成員。
9.派生類的構造函數和析構函數:
派構:
1.一般格式: 派生類名 (派生類構造函數總參數表):基類構造函數(參數表1),子對象名(參數表2)
{派生類中數據成員初始化};
2.調用順序: a.基類的構造函數。b.子對象類的構造函數(如果有的話). c.派生類構造函數。
10.多繼承:是指派生類具有多個基類。
多繼承的構造函數:
《派生類名》(總參數表):《基類名1》(參數表1),《基類名2》(參數表2),...
{派生類構造函數體}
11.虛基類:如果基類被聲明為虛基類,則重復繼承的基類在派生磁對象實例中只好存儲一個副本,否則,將出現多個基類成員副本。
虛基類說明格式如下: virtual<繼承方式><基類名>
class B:virtual public A
注意:a.如果一個派生類有直接或間接的虛基類,那么派生類的構造函數的成員初始列表中必須列出對虛基類的調用,如果未被列出,則表示使用該基類的缺省構造函數來初始化派生類對象中的虛基類子對象。
b.虛基類的構造函數先于非虛基類的構造函數調用。
c.只有建立對象的那么個派生類的構造函數調用虛基類的構造函數,而該派生類的基類中所列出的對這個虛基類的構造函數的調用在執行中被忽略。
12.運算符重載:
operator 函數用法:(不能有下列字符:'::','.','*','->','? :')
1.一般:int class_name::operator <運算符> (形參列表) (例92)
2.增量減量運算符: (例93,94,95,96)
a.將一個增量運算符重載為前置的成員函數:
int class_name::operator++();
b.將一個增量運算符重載為后置的成員函數:
int class name::operator++(int);
c.將一個增量運算符重載為前置的友元函數:
int operator ++(class_name&);
d.將一個增量運算符重載為前置的友元函數:
int operator ++(class_name&,int);
e.下標運算符:
int class_name::operator[](形參) //只能是非靜態成員函數
f.函數調用運算符:
int class_name::operator()(形參表)//只能是非靜態函數,且不可以帶有缺省的參數
g.成員選擇運算符:
class_name $/* class_name::operator->();
h.new delete運算符:
void *class_name::operator new(siz_t,<arg_list>);
void *class_name::operator delete(void *,<size_t>);
new delete只能被重載為類的成員函數,不能是友元。而且無論是否使用關鍵字static
進行修飾,重載了的new和delete均為類的表態成員函數。
對于typedef unsigned size_t;
在頭文件alloc.h,mem.h,stddef.h,stdio.h,stdlib.h均說明;
i.友元函數:
可以是一個類的非靜態函數,也可以是類的友元函數。
{friend complex operator+(complex&,complex&);
};
以下五種運算符不說明成友元運算符:
"=","()","[]","->","type";
j.轉換函數:
class_name::operator type(); //type 是任何一個合法的C++的類型名(包括基本數據類型和導出數據類型)以及由關鍵字const和volatile引出的表達示。)
//不帶任何參數,也無返回值類型,總是返回type的值。只能是類的成員函數,不能說明為友元運算符。
k.類的賦值運算與運算符重載:
person & person::operator=(person &p)
{dele Name;
Name=new char[strlen(p.Name)+1];
strcpy(Name,p.Name);
Age=p.Age;
Sex=p.Sex;
return *this;
}
典型例題。當用系統自帶對象賦值的函數,如果對象里有如 *Name 型的,則賦值后會使兩個指針同時指向一個成員元素的地址,當調用析構函數釋放時,會釋放兩次,多釋放一次,而產生錯誤,這個典型例題是用于把一個成員元素復制到另一個對象中,不是單純移動指針,當調用析構函數時,會釋放兩次。
l.重載函數:系統僅對形參加以區別。
13.虛函數
一般情況下,指向一個對象的指針,不允許指向另一個對象,但指向基類對象的指針可以指向它的派生類,并可以訪問派生類中原基類成員。
如果一個函數一旦說明為虛函數,則無論說明它的類被繼承了多少層,在每一層中該函數都保持該virturl特性。且可以在派生類中對該函數省略virtual.
虛函數必須是類的一個成員函數,不能是友元,但它可以是另一個類的友元。虛函數不能是一個靜態成員。
設定綁定方式,使程序具有靈活性,但執行效率低,占用內存多.
14.抽象類:純虛函數
純虛函數的一般形式為:virturl 類型名(參數表)=0;抽象類不能申請對象。
15.類屬結構:
1.函數模板:template <class 模板形參表>
返回值類型 函數名(模板函數形參表)
{
函數體;
}
example:
template <class T>
void swap(T &.x,T&.y)
{T t;
t=x;x=y;y=t;
}
2.重載函數模板:調用用次序:
1)尋找一個完全匹配的函數,找到,調用之。
2)尋找一個函數模板,將其實例化產生一個匹配的模板函數,找到,調用之。
3)尋找重載函數中有無通過類型轉換后產生參數匹配的函數,若有,調用之。
3.類模板:template <class 模板形參>
class 類模板名
{
類體;
}
example: tempplate <class T>
class stack
{private:
T *date;
int top;
public:
isempty();
}
template <class T>
{...}
16.類模板的友元:
a.一般的類模板友元函數。
b.封閉型的類模板友元函數。當用類型參數將類模板實例化為某個具體的模板類時,該類模板所包含的友元函數也將隨之實例化。
c.開放型的類模板友元函數。
例一百二十一。
17.C++的I/O流庫
1. I/O標準流類
-----------------------------------------
c++名字 | 設備 | C中的名字 | 默認的含義
-----------------------------------------
cin | 鍵盤 | stdin | 標準輸入
-----------------------------------------
cout | 屏幕 | stdout | 標準輸出
-----------------------------------------
cerr | 屏幕 | stderr | 標準錯誤
-----------------------------------------
clog | 打印機 | stdprn | 打印機
-----------------------------------------
2。鍵盤輸入
cin>>a>>b>>c; //Ctrl+z終止
cin.get(char &ch)//從輸入流獲取一個字符,不忽略空格Ctrl+z終止
cout.put(ch)//輸出一個字符
EOF//其值為-1,相當于終止符
cin.geline(char *buf,int limit,Deline='\n')//buf為一個指針或數組,limit為字符個數,Deline為讀取字符指定結束符。作用:從鍵盤讀入一串字符。結束用Ctrl+z.
cin.gcount()//返回getline()剛剛讀過的字符個數
cin.read(char *buf,int size)//讀入指定數目的字符
cout.write(const char *str,int n)//cout.write("string",strlen("string");則輸出全部字符。
cin.peek()//返回輸入流的下一個字符,但是不提取它。
long(a)//a可以是指針地址,作用,強制轉換為十進制數。
(void*)//ex:char str="abcde";cout<<str;將str為首地址字符串的首地址輸出。
18.輸入符,提取符重載:<< >>
例154 155例題
19.磁盤文件的輸入。頭文件#include"fstream.h" //例題從156開始
1.打開文件:
a. fstream outfile;
outfile.open("f1.txt",ios::out);//其中fstream為系統對文件專用操作類
b. ofstream ostream("f1.txt");
ofstream ostrm; ostrm.open("f1.txt");//表示打開某個寫文件
c. ifstream istrm("f2.txt");
ifstream istrm; istrm.open("f2.txt");//表示打開某個讀文件
-----------------------------------------------------------------------
方式名 | 用途
----------------------------------------------------------------------
in | 以輸入方式打開文件
-----------------------------------------------------------------------
out | 以輸出方式打開文件
-----------------------------------------------------------------------
app | 以輸出追加方式打開文件
-----------------------------------------------------------------------
ate | 文件打開時,文件指針位于文件尾
-----------------------------------------------------------------------
trunc | 如果文件存在,將其長度截斷為零,并清除所有內容,如果文件不存在,則創建新文件
-----------------------------------------------------------------------
binarg | 以二進制方式打開文件,缺省時為文本方式
-----------------------------------------------------------------------
nocreate |打開一個已有文件,如該文件不存在,則打開失敗
-----------------------------------------------------------------------
noreplace |如果文件存在,除非設置 ios::ate或ios::app,否則打開失敗
-----------------------------------------------------------------------
ios::in |ios::out |以讀和寫的方式打開文件
-----------------------------------------------------------------------
ios::out|ios::binary |以二進制方式打開文件
-----------------------------------------------------------------------
ios::in|ios::binary |以二進制方式打開文件
-----------------------------------------------------------------------
2. 關閉文件:
fstream outfile;
outfile.close();
3. 打開文件失敗退出程序:用函數abort();退出,在頭文件<stdlib.h"
4.判斷文件結束函數.example: infile.eof()
5.getline(char*,sizeof(s));//讀取一串字符
get()/put()//對文件字符操作,例如outfile.get
6.隨機訪問數據文件:
1)讀指針
istream &istream::seekg(流中位置)//
istream &istream::seekg(偏移量,參照位置)//參照位置分為:cur=1/beg=0/end=2 input.seekg(-100,ios::cur);
streampos istream::tellg();//其中streampos定義為long型,它返回一個long型且值為當前指針離文件開頭的位置(字節數)
2)寫指針
ostream &ostream::seekp(流中的位置)
ostream &ostream::seekp(偏移量,參照位置)//參照位置同上
streampos ostream::tellp();
注意:讀函數中有get(),寫函數中有put(),操作讀指針用seekg(),而寫指針用seekp();write()和read()中的第一個參數必須為(char *),如果不是,一定要強制轉換
7. while(!cin);//表示輸入流有錯。
cin.clear();//原型 void ios::clear(int=0);其用途是將錯誤狀態的標志字中錯誤標志位清除,重新判斷輸入。
cin.ignor(80,ch);//如果ch='\n',一般表示忽略一行,重新到下一行去輸入
istream &istream::ignore(int n=1,int t=EOF);//跳過輸入流中指定數量的字符的函數,t為終止符,一般EOF相當于<ctrl+z>操作
istream &istream::pubback(char ch)//退回一個字符到輸入流的函數,其中ch是指出要退回輸入流的字符。
20. 格式化輸入和輸出: 例題從 167開始
A.設置流的格式化標志
1).控制格式的標志位
------------------------------------------------------------------------------
標志位 | 值 | 含義 |輸入/輸出
------------------------------------------------------------------------------
skipws | 0x0001 | 跳過輸入中的空白符 | i
------------------------------------------------------------------------------
left | 0x0002 | 輸出數據左對齊 | o
------------------------------------------------------------------------------
rignt | 0x0004 | 輸出數據右對齊 | o
------------------------------------------------------------------------------
internal | 0x0008 | 數據的符號左對齊,數據本身右對齊,之間為填充符 | o
------------------------------------------------------------------------------
dec | 0x0010 | 轉換基數為十進制形式 | i/o
------------------------------------------------------------------------------
oct | 0x0020 | 轉換基數為八進制形式 | i/o
------------------------------------------------------------------------------
hex | 0x0040 | 轉換基數為十六進制形式 | i/o
------------------------------------------------------------------------------
showbase | 0x0080 | 輸出數據前有0/0x | o
------------------------------------------------------------------------------
showpoint | 0x0100 | 浮點數輸出帶有小數點 | o
------------------------------------------------------------------------------
uppercase | 0x0200 | 用大寫字母輸出十六進制數值 | o
------------------------------------------------------------------------------
showpos | 0x0400 | 正數前面有“+”號 | o
------------------------------------------------------------------------------
scientfic | 0x0800 | 浮點數輸出采用科學表示法 | o
------------------------------------------------------------------------------
fixed | 0x1000 | 使用定點數形式表示浮點數 | o
------------------------------------------------------------------------------
unitbuf | 0x2000 | 完成輸入操作后立即刷新流的緩沖區 | o
------------------------------------------------------------------------------
stdio | 0x4000 | 完成輸入操作后刷新系統的stdout | o
------------------------------------------------------------------------------
2).使用成員函數設置標志字:
1.long flags() //該函數用來返回標志字
2.long flags(long) //該函數使用參數更新標志字,返回更新前的標志字
3.long setf(long setbits,long field)//將field所指定的標志清零,將setbits為1的位置1,返回以前的標志字
4.long setf(long) //設置參數所指定的那些標志的位,返回更新前的標志字
5.long unsetf(long)//該函數用來清除參數所指定的那些標志位的位,返回更新前的標志字
在ios類中,定義了下面的表態類對象;
static const long basefield; //其值為dec/oct/hex
static const long adjustfield //其值為left/right/internal
static const long floatfield //其值為scientific/fixed
example: cin.setf(ios::dec,ios::basefield
B.格式輸出函數:
1).設置輸出數據所占寬度的函數
1.int width()//該函數返回當前輸出數據的寬度
2.int width(int)//刻函數用來設置當前輸出數據的寬度為參數值,并返回更新前的寬度值
2).填充當前寬度內的填充字符函數
1.char fill()//該函數用來返回當前所使用的填充字符
2.char fill(char)//該函數用來設置填充字符為參數值所表示的字符,并返回更新前的填充字符
3).設置浮點數輸出精度函數
1.int precision()//該函數返回當前浮點數的有效數字的個數
2.int precision(int)//該函數設置浮點數輸出時的有效數字個數,并返回更新前的值。
注意:float型實數最多提供7位有效數字,double型褸最多提供15位有效數字,long。。。提供19位有效數字
C.操作子:為了簡化操作,提供了一系列操作子,操作子實際上是對象
--------------------------------------------------------------------
dec | 數值數據采用十進制表示 | i/o
--------------------------------------------------------------------
hex | 數值數據采用十六進制表示 | i/o
--------------------------------------------------------------------
oct | 數值數據采用八進制表示 | i/o
--------------------------------------------------------------------
setbase(int)| 設置數據轉換基數為n(n為0,8,10,16),其中0表示缺省基數 | i/o
--------------------------------------------------------------------
ws | 提取空白符 | i
--------------------------------------------------------------------
ends | 插入空白符 | o
--------------------------------------------------------------------
flush | 刷新與流相關聯的緩沖區 | o
--------------------------------------------------------------------
resetiosflags(long) | 清除參數所指定的標志位 | i/o
--------------------------------------------------------------------
setiosflags(long) | 設置參數所指定的標志位 | i/o
--------------------------------------------------------------------
setfill(int) | 設置填充字符 | o
--------------------------------------------------------------------
setsprecision(int) | 設置浮點數輸出的有效數字個數 | o
--------------------------------------------------------------------
setw(int) | 設置輸出數據項的域寬 | o
--------------------------------------------------------------------
21. 字符串流:例170開始
c++提供了兩個類:頭文件#include"strstrea.h"
1.ostrstream:其是從ostream派生來的,將不同類型轉換為字符串,并存放到數組中.
ostrstream::ostrstream();//缺省構造函數,它用來建立存儲所插入的數據的數組對象;
ostrstream::ostrstream(char *s,int n,int mode=ios::out);//此構造函數中S是字符指針或字符數組,N是用來指定這個數組最多能存放的字符個數.mode參數給出流式的方式,缺省為out方式,還可選用ate和app方式.
ostrstream類還提供了如下的成員函數:
int ostrstream::pcount();//返回流中已插入的字符個數;
char *ostrstream::str(); //返回標志字符串的數組的指針值;
2.istrstream:其是從istream派生來的,將文本項轉換為變量所需要的內部格式.
istrstream::istrstream(char *s);//構造函數中S是一個字符指針或字符數組,使用該串來初始化要創建的流對象
istrstream::istrstream(char *s,int n);//此構造函數是使用串中前N個字符來構造串對象
22.異常處理
try{ }
throw 變量
catch(形式參數變量){ } //其中形數參數變量只能是一個,且類型不能像函數傳遞形參那樣進行自動轉換,必須完全批配
注意:1.當找不到指導配項時,就用黑認批配項abort()一終止程序
2.異常處理的數據類型是公有基類,拋擲異常的數據類型是派生類
3.異常處理的數據類型是指向公有基類的指針,拋擲異常的數據類型是指向派生類的指針
catch(基類)總能夠捕獲throw(派生類對象),所以catch(基類)塊總是放在catch(派生類)塊的后面,以避免catch(派生類)永遠不能捕獲異常