版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++
個(gè)人筆記總結(jié)
王
小
龍
Goodluck
Believeyourself
Justgo
WORD完整版--可編輯…-教育資料分享
概述:
一、C++語言語法基礎(chǔ)(6)
1.從c至UC++的過渡
二、數(shù)據(jù)結(jié)構(gòu)和算法
1.基本數(shù)據(jù)結(jié)構(gòu),堆棧、隊(duì)列、鏈表、二叉樹,實(shí)現(xiàn)和應(yīng)用⑵
三、模板和STL
四、階段項(xiàng)目
簡(jiǎn)化的企業(yè)管理信息系統(tǒng)(MIS)
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
第一課從C到C++的過渡
一、背景介紹
算盤-面向硬件的編程
電子計(jì)算機(jī)-機(jī)器語言的編程1010
-匯編語言的編程ADD
-高級(jí)語言的編程Fortran
printf-12);
-結(jié)構(gòu)化程序設(shè)計(jì)C/PASCL
順序、分支、循環(huán)、函數(shù)
-面向?qū)ο蟮某绦蛟O(shè)計(jì)C++/Java/C#
-面向問題的程序設(shè)計(jì)
1960-Algol60,算法語言,遠(yuǎn)離硬件,不適合進(jìn)行系統(tǒng)開發(fā)
1963-劍橋大學(xué),CPL,在Algol60的基礎(chǔ)上增加對(duì)系統(tǒng)開發(fā)的支
持,復(fù)雜,不易掌握,不易使用
1970-MIT,BCPL,CPL的精華版,易學(xué)易用,太慢,不實(shí)用
1972-KenThomposon,B語言,通過運(yùn)行時(shí)支持優(yōu)化BCPL的性能,缺少類型
1973-DennisRitchie,C語言,用C重新實(shí)現(xiàn)UNIX內(nèi)核
1978-《TheCProgrammingLanguage》,第一個(gè)C語言的事實(shí)標(biāo)準(zhǔn)
1989-ANSIC,C89
1990-ISOC,C90
1999-ISOC修訂,C99
197X-BajarneStroustrup,Simula早期的面向?qū)ο笳Z言,性能低
下,B語言。
1979-貝爾實(shí)驗(yàn)室,多核UNIX系統(tǒng)仿真,Cpre,
通過擴(kuò)展宏為C語言增加類似Simula的面向?qū)ο髾C(jī)制。CwithClass:
Simula-類
Alogo68-操作符重載
Ada-模板、名字空間
Smalltalk-引用、異常
C是C++的子集,C++是對(duì)C的擴(kuò)展。
1983-C++命名
1985-CFront1.0,第一款商用C++編譯器
1987-GNUC++
1990-BorlandC++
1992-MicrosoftC++,IBMC++
1998-ISOC++98
2003-ISOC++03
2011-ISOC++2011/C++ll/C++0x
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
二、C++語言的使用領(lǐng)域:
1.游戲開發(fā):強(qiáng)建模能力,性能高。
2.科學(xué)計(jì)算:FORTRAN,C++算法庫。
3.網(wǎng)絡(luò)和分布式:ACE框架。
4.桌面應(yīng)用:VC/MFC,Office,QQ,多媒體
5.操作系統(tǒng)和設(shè)備驅(qū)動(dòng):優(yōu)化編譯器的發(fā)明使C++在底層開發(fā)方面可
以和C向媲美。
既需要性能,同時(shí)又要有面向?qū)ο蟮慕!?/p>
三、C++比C更豐富
1.支持面向?qū)ο?,將問題域和方法域統(tǒng)一化。宏觀面向?qū)ο螅⒂^面
向過程。
2.支持泛型編程。
intadd(inta,intb){...}
template<typenameT>
Tadd(Ta,Tb){...}
3.支持異常機(jī)制。
intfunc(void){
}
intmain(void){
if(func()==-1){
錯(cuò)誤處理;
)
}
4.操作符重載
四、第一個(gè)C++程序
1.編譯器:g++,如果用gcc需要帶上Tstdc++,
指定其使用標(biāo)準(zhǔn)C++的運(yùn)行庫。
3.頭文件:^include<iostream>
大多數(shù)標(biāo)準(zhǔn)庫頭文件都沒有.h后綴。
4.輸出:cout-標(biāo)準(zhǔn)輸出對(duì)象
輸入:cin-標(biāo)準(zhǔn)輸入對(duì)象
插入運(yùn)算符:?
提取運(yùn)算符:?
5.std:所有標(biāo)準(zhǔn)庫的函數(shù)、對(duì)象、類型都位于std名字空間中。
五、名字空間
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
1.對(duì)程序中的標(biāo)識(shí)符(類型、函數(shù)、變量),
按照某種邏輯規(guī)則劃分成若干組。
namespace名字空間名{
名字空間成員;
}
1作用于限定符:名字空間名::名字空間成員,
表示訪問特定名字空間中的特定成員。
例子:
ttinclude<iostream>
intmain(void){
std::cout<<"Hello,World!〃?std::endl;
inti;
doubled;
chars[256];
//scanf&i,&d,s);
std::cin>>i?d>>s;
//printf("%d%lf%s\n”,i,d,s);
std::cout<<i<<''<<d<<''<<s<<'\n';
return0;
}
2名字空間指令:
usingnamespace名字空間名;
在該條指令之后的代碼對(duì)指令所指名字空間中的所有成員都可見,
可直接訪問這些成員,無需加“::”。
例:usingnamespacestd;
3名字空間聲明:
using名字空間名::名字空間成員;
將指定名字空間中的某個(gè)成員引入當(dāng)前作用域,
可直接訪問這些成員,無需加“::”。
如果一個(gè)標(biāo)識(shí)符沒有被顯示地定義在任何名字空間中,
編譯器會(huì)將其缺省地置于匿名名字空間中。
對(duì)匿名名字空間中的成員通過“::名字空間成員”的形式訪問。
--完整版學(xué)習(xí)資料分享--
WORD完整版?一可編輯--教育資料分享
namespacensl{
namespacens2{
namespacens3{
voidfoo(void){...}
}
)
}
nsl::ns2::ns3::foo();
usingnamespacensl::ns2::ns3;
foo();
例子:名字空間
#include<iostream>
usingnamespacestd;
//namespace{
voidprint(intmoney){
cout<<money?endl;
)
//)
//農(nóng)行名字空間
namespaceabc{
intbalance=0;
voidsave(intmoney){
balance+=money;
}
voiddraw(intmoney){
balance一二money;
)
}
namespaceabc{
voidsalary(intmoney){
balance+=money;
}
voidprint(intmoney){
cout<〈〃農(nóng)行:〃;
::print(money);
}
}
//建行名字空間
namespaceccb{
intbalance=0;
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
voidsave(intmoney){
balance+=money;
}
voiddraw(intmoney){
balance一二money;
}
voidsalary(intmoney){
balance+=money;
}
}
intmain(void){
usingnamespaceabc;//名字空間指令
save(5000);
cout<<〃農(nóng)行:〃<<balance<<endl;
draw(3000);
cout<<〃農(nóng)行:〃<<balance<<endl;
ccb::save(8000);
cout<<〃建行:〃<<ccb::balance<<endl;
ccb::draw(5000);
cout<<〃建行:〃ccb::balance<<endl;
usingccb::salary;//名字空間聲明
//usingabc::salary;
salary(6000);
cout<<〃建行:〃<<ccb::balance<<endl;
abc::print(abc::balance);
return0;
}
六、C++中的結(jié)構(gòu)、聯(lián)合和枚舉
和c語言的不同:
1)定義結(jié)構(gòu)型變量時(shí),可以省略struct關(guān)鍵字。
2)結(jié)構(gòu)內(nèi)部可以定義函數(shù)一一成員函數(shù)。
3)sizeof(空結(jié)構(gòu))->1
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
例子:
#include<iostream>
usingnamespacestd;
structStudent{
charname[128];
intage;
voidwho(void){〃成員函數(shù)
cout<<〃我叫〃<<name<<”,今年〃<<age
<<〃歲了?!?lt;<endl;
}
};
intmain(void){
Studentstudent={〃張飛〃,25},*ps=&student;
student,who();
ps->who();
structA{};
cout<<sizeof(A)<<endl;
return0;
}
增加了匿名聯(lián)合的概念。借用聯(lián)合語法形式,
描述一些變量在內(nèi)存中的布局方式。
intmain()
(
UNION
(
inta;
charch[4];
);
a=0xl2345678;
}
定義聯(lián)合變量時(shí),可以不加union
例子:
#include<iostream>
usingnamespacestd;
intmain(void){
//匿名聯(lián)合
union{
intx;
charc[4]/*={'A','B','C','D'}*/;
};
cout?(void*)&x????(void*)c<<endl;
--完整版學(xué)習(xí)資料分享
WORD完整版一?可編輯一?教育資料分享
x=0x12345678;
for(inti=0;i<4;++i)
cout<<hex<<(int)c[i];
cout<<endl;
return0;
}
枚舉是一個(gè)獨(dú)立的數(shù)據(jù)類型。
C:
enumE{a,b,c};
enumEe;
e二a;
e=1000;
C++:
enumE{a,b,c};
Ee;
e二a;
e=b;
e=c;
b=l;//ERROR!
e=1000;//ERROR!
e=1;//ERROR!
例子:
#include<iostream>
usingnamespacestd;
intmain(void){
enumE{a,b,c};
Ee;
e二a;
e=b;
e=c;
//e=1000;〃報(bào)錯(cuò)
//e=1;〃報(bào)錯(cuò)return0;)
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
七、C++的布爾類型,跟在cout后面可以boolalpha
boolb=true;
b=false;
cout<<sizeof(b)<<endl;//1
b=100;
b=1.234;
b=〃hello〃;
b='A';
八、C++中的運(yùn)算符別名
&&-and
I-or
&-bitand
-xor
{-<%
}-%>
[-<:
]-:>
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
九、C++中的函數(shù)
1.重載:條件
在同一個(gè)作用域中,
函數(shù)名相同,
參數(shù)表不同的函數(shù),
構(gòu)成重載關(guān)系。
C++編譯器會(huì)對(duì)程序中的函數(shù)做換名,
將參數(shù)表中的類型信息匯合到函數(shù)名中,以保證函數(shù)名的唯一。
通過extern〃C〃,可以要求編譯器不做C++換名,以方便在C語言的模塊中使用C++
編譯生成的代碼。
方式一:
extern"C"{
intadd(inta,intb){
returna+b;
)
intsub(inta,intb){
returna-b;
)
)
方式二:
extern"C'intadd(inta,intb,intc){
returna+b+c;}
1)如果調(diào)用一個(gè)函數(shù)時(shí),沒有提供實(shí)參,那么對(duì)應(yīng)形參就取缺省值。
2)如果一個(gè)參數(shù)帶有缺省值,那么它后邊的所有參數(shù)必須都帶有缺省值。
3)如果一個(gè)函數(shù)聲明和定義分開,那么缺省參數(shù)只能放在聲明中。
4)避免和重載發(fā)生歧義。
5)只有類型而沒有名字的形參,謂之啞元。
i++-operator++
++i
VI:voiddecode(intarg){...}
V2:voiddecode(int){...}
例子1:重載與缺省值
#include<iostream>
usingnamespacestd;
voidfoo(inta=10,doubleb=0.01,
constchar*c=〃tarena〃);〃函數(shù)1
voidfoo(void){}〃函數(shù)2
〃函數(shù)1與函數(shù)2構(gòu)成重載關(guān)系
voidbar(int){〃函數(shù)3
cout?”bar(int)”<<endl;
}
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
voidbar(int,double){〃函數(shù)4
cout<<"bar(int,double)〃<<endl;
)
〃函數(shù)3與函數(shù)4構(gòu)成重載關(guān)系
intmain(void){
foo(1,3.14,〃hello〃);〃調(diào)用函數(shù)1
foo(1,3.14);〃調(diào)用函數(shù)1
foo(1);〃調(diào)用函數(shù)1
//foo();//歧義,可以調(diào)用函數(shù)2,但也可以調(diào)用函數(shù)L因?yàn)楹瘮?shù)1在不提供實(shí)參的情況下,
可以取缺省值。
bar(100);〃調(diào)用函數(shù)3
bar(100,12.34);〃調(diào)用函數(shù)4
return0;
例子2:重載與作用域
#include<iostream>
usingnamespacestd;
namespacensl{
intfoo(inta){函數(shù)1
cout<<〃nsl::foo(int)〃<<endl;
returna;
}
);
namespacens2{
doublefoo(doublea){函數(shù)2
cout<<〃ns2::foo(double)〃<<endl;
returna;
}
);
intmain(void){
usingnamespacensl;//名字空間指令
usingnamespacens2;//名字空間指令
cout<<foo(10)?endl;//10調(diào)用函數(shù)1,作用域可見ns2與nsl,所以與函數(shù)2構(gòu)成重
載
cout?foo(1.23)?endl;//l.23調(diào)用函數(shù)2,作用域可見ns2與nsl,所以與函數(shù)1構(gòu)成
重載
usingnsl::foo;〃名字空間聲明
(當(dāng)同時(shí)出現(xiàn)名字指令與名字空間聲明,則名字空間聲明會(huì)隱藏名字空間指令)
coutz<foo(10)?endl;//10,調(diào)用函數(shù)1,只可見名字空間nsl的foo(),所以也并不構(gòu)
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
成重載。
cout<<foo(1.23)<<endl;//10,調(diào)用函數(shù)1,只可見名字空間nsl的foo(),所以也并不構(gòu)
成重載。
usingns2::foo;〃名字空間聲明
cout?foo(10)?endl;//10,調(diào)用函數(shù)1,可見名字空間nsl與名字空間ns2的foo(),
所以構(gòu)成重載。
cout?foo(1.23)?endl;//l.23,調(diào)用函數(shù)2,可見名字空間nsl與名字空間ns2的foo(),
所以構(gòu)成重載。
return0;
}
1)編譯器用函數(shù)的二進(jìn)制代碼替換函數(shù)調(diào)用語句,減少函數(shù)調(diào)用的時(shí)間開銷。這種優(yōu)
化策略成為內(nèi)聯(lián)。
2)頻繁調(diào)用的簡(jiǎn)單函數(shù)適合內(nèi)聯(lián),而稀少調(diào)用的復(fù)雜函數(shù)不適合內(nèi)聯(lián)。
3)遞歸函數(shù)無法內(nèi)聯(lián)。
4)通過inline關(guān)鍵字,可以建議編譯對(duì)指定函數(shù)進(jìn)行內(nèi)聯(lián),但是僅僅是建議而已。
inlinevoidfoo(intx,inty){...}
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
十、C++的動(dòng)態(tài)內(nèi)存分配
malloc/calloc/realloc/free
1.new/delete:對(duì)單個(gè)變量進(jìn)行內(nèi)存分配/釋放
2.new□/delete口:對(duì)數(shù)組進(jìn)行內(nèi)存分配/釋放
例子:new與delete
ttinclude<iostream>
usingnamespacestd;
intmain(void){
〃int*pi=(int*)malloc(sizeof(int));
//free(pi);//c中的方法
int*pi=newint;
*pi=1000;
cout<<*pi?endl;
deletepi;〃一定要釋放內(nèi)存,否則會(huì)造成內(nèi)存泄露,很嚴(yán)重
pi=NULL;〃不要忘記這個(gè),雖然不會(huì)報(bào)錯(cuò),但是要有好習(xí)慣
/*
*pi=2000;
cout<<*pi?endl;〃pi指向的內(nèi)存地址已經(jīng)被釋放,被初始化為指向NULL
*/
pi=newint[10];
for(size_ti=0;i<10;++i)
pi[i]=i;
for(size_ti=0;i<10;++i)
cout<<pi[i];
cout<<endl;
delete[]pi;〃千萬記住new□要用delete□來釋放內(nèi)存
pi二NULL;
pi=newint(1234);〃用new分配內(nèi)存的同時(shí)初始化賦一個(gè)值。
cout<<*pi?endl;//1234
deletepi;
pi=NULL;
charbuf[4]={0x12,0x34,0x56,0x78};
pi=new(buf)int;
cout?hex?*pi?endl;
//deletepi;
cout<<(void*)pi<〈''〈<(void*)buf?endl;
int(*p)[4].newint[3][4];
delete[]p;
int(*q)[4][5]=newint[3][4][5];
deletedq;
return0;
、引用
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
1.引用即別名。
inta=20;
int&b=a;//int*b=&a;
b=10;//*b=10;
cout<<a<<endl;//10
2.引用必須初始化。
inta;
int*p
a=20
p=&a
int&b//ERROR!
int&b=a;//OK
3.引用一旦初始化就不能再引用其它變量。
inta=20,c=30;
int&b=a;
b=c;//c=>b/a
1)引用型參數(shù)
b.避免拷貝,通過加const可以防止在函數(shù)中意外地修改實(shí)參的值,同時(shí)還可以接受
擁有常屬性的實(shí)參。
2)引用型返回值
intb=10;
inta=func(b);
func(b)=a;
從一個(gè)函數(shù)中返回引用往往是為了將該函數(shù)的返回值作為左值使用。但是,一定要保
證函數(shù)所返回的引用的目標(biāo)在該函數(shù)返回以后依然有定義,否則將導(dǎo)致不確定的后
果。
不要返回局部變量的引用,可以返回全局、靜態(tài)、成員變量的引用,也可以返回引用
型形參變量本身。
1)引用的本質(zhì)就是指針,很多場(chǎng)合下引用和指針可以互換。
2)在C++層面上引用和指針存在以下不同:
A.指針式實(shí)體變量,但是引用不是實(shí)體變量。
int&a=b;
sizeof(a);//4
doublefi.d=f;
--完整版學(xué)習(xí)資料分享--
WORD完整版?一可編輯--教育資料分享
sizeof(d);//8
B.指針可以不初始化,但是引用必須初始化。
C.指針的目標(biāo)可以修改,但是引用的目標(biāo)的不能修改。
D.可以定義指針的指針,但是不能定義引用的指針。
inta;
int*p=&a;
int**pp=&p;//OK
int&r=a;
int&*pr=&r;//ERROR
E.可以定義指針的引用,但是不能定義引用的引用。
inta;
int*p=&a;
int*&q=p;//OK
int&r=a;
int&&s=r;//ERROR
F.可以定義指針的數(shù)組,但是不能定義引用的數(shù)組。
inta,b,c;
int*parr[]={&a,&b,&c};//OK
int&rarr[]={a,b,c};//ERROR
可以定義數(shù)組的引用。
intarr[]={1,2,3};
int(&arr_ref)[3]=arr;//OK
例子:指針與引用
ttinclude<iostream>
usingnamespacestd;
voidswapl(inta,intb){
intc=a;
a=b;
b=c;
}
voidswap2(int*a,int*b){
intc=*a;
*a=*b;
*b二c;
}
voidswap3(int&a,int&b){
intc=a;
a=b;
b=c;
}
voidswap4(constchar*x,constchar*y){
constchar*z=x;
x二y;
y二z;
)
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
voidswap5(constchar**x,constchar**y){
constchar*z二*x;
*x=*y;
*y二z;
}
voidswap6(constchar*&x,constchar*&y){
constchar*z=x;
x=y;
y=z;
}
structStudent{
charname[1024];
intage;
);
voidprint(conststructStudent&s){
cout<<s.name<<〃,〃<<s.age<<endl;
//s.age=-1;
)
voidfoo(constint&x){
cout<<x<<endl;
}
intmain(void){
inta=100,b二200;
//swapl(a,b);
//swap2(&a,&b);
swap3(a,b);
cout?a?J'?b?endl;//200100
constchar*x二〃hello〃,*y="world”;
//swap4(x,y);
//swap5(&x,&y);
swap6(x,y);
cout<<x<<''<<y<<endl;
Students={”張飛〃,22};
print(s);
print(s);
foo(100);
return0;
}
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
十二、顯示類型轉(zhuǎn)換運(yùn)算符
C:目標(biāo)類型變量=(目標(biāo)類型)源類型變量;
statijcast〈目標(biāo)類型〉(源類型變量)
如果在目標(biāo)類型和源類型之間某一個(gè)方向上可以做隱式類型轉(zhuǎn)換,那么在兩個(gè)方向上
都可以做靜態(tài)類型轉(zhuǎn)換。反之如果在兩個(gè)方向上都不能做隱式類型轉(zhuǎn)換,那么在任意
一個(gè)方向上也不能做靜態(tài)類型轉(zhuǎn)換。
int*pl=...;
void*p2=pl;
pl=static_cast<int*>(p2);
charc;
inti=c;
如果存在從源類型到目標(biāo)類型的自定義轉(zhuǎn)換規(guī)則,那么也可以使用靜態(tài)類型轉(zhuǎn)換。
例子:靜態(tài)類型轉(zhuǎn)換
#include<iostream>
usingnamespacestd;
intmain(void){
int*pl=NULL;//pl為int型的指針
void*p2=pl;〃p2為void型的指針
pl=static_cast<int*>(p2);〃將void型的p2指針轉(zhuǎn)換為int型指針并復(fù)制給int型的
pl指針。
return0;
}
dynamic_cast〈目標(biāo)類型〉(源類型變量)
用在具看多態(tài)性的父子類指針或引用之間。
const_cast〈目標(biāo)類型〉(源類型變量)
給一個(gè)擁有const屬性的指針或引用去常
constinta=100;
constint*pl=&a;
*pl=200;//ERROR
int*p2=const_cast<int*>(pl);
*p2=200;//OK
reinterpret_cast(目標(biāo)類型〉(源類型變量);
在不同類型的指針或引用之間做類型轉(zhuǎn)換,以及在指針和整型之間做類型轉(zhuǎn)換。
5.目標(biāo)類型變量=目標(biāo)類型(源類型變量);
inta=int(3.14);
例子一:常類型轉(zhuǎn)換
#include<iostream>
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
usingnamespacestd;
intmain(void){
constvolatileinta=100;
(關(guān)鍵字volatile在描述變量時(shí)使用,阻止編譯器優(yōu)化那些以valatile修飾的變量,volatile被用在
一些變量能被意外方式改變的地方,例如:拋出中斷,這些變量若無volatile可能會(huì)和編譯器執(zhí)行的優(yōu)
化相沖突.)
//a=200;
constvolatileint*pl=&a;
//*pl=200;
int*p2=const_cast<int*>(pl);//去常,去掉常屬性
*p2=200;
cout?*p2?endl;//200
cout?a<<endl;//200
//cout?100?endl;
return0;
)
例子二:解釋型類型轉(zhuǎn)換
#include<iostream>
usingnamespacestd;
intmain(void){
inti=0x12345678;
char*p二reinterpret_cast<char*>(&i);
for(size_ti=0;i<4;++i)
cout<<hex<<(int)p[i];//78563412
cout<<endl;
float*q=reinterpret_cast<float*>(&i);
cout?*q<<endl;
void*v二reinterpret_cast<void*>(i);
cout?v<<endl;
return0;
十三、C++之父的建議
1.少用宏,多用const、enum和inline
完整版學(xué)習(xí)資料分享
WORD完整版--可編輯…-教育資料分享
constdoublePAI=3.14159;
^defineERROR_FILE-1
#defineERROR一MEM-2
enum{
ERROR_FILE=-1,
ERROR_MEM=-2
);
#definemax(a,b)((a)>(b)?(a):(b))
inlineintdoub1emax(doublea,doub1eb){
returna>b?a:b;
}
2.變量隨用隨聲明同時(shí)初始化。
3.少用malloc/free,多用new/delete。
4.少用C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換,多用類型轉(zhuǎn)換運(yùn)算符。
5.少用C風(fēng)格的字符串,多用string。
6.樹立面向?qū)ο蟮木幊趟枷搿?/p>
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
附加:
string類:
例子:
ttinclude<iostream>
ftinclude<cstring>
ttinclude<cstdio>
usingnamespacestd;
intmain(void){
stringsi(〃hello〃);
strings2="world”;
(si+=〃〃)+=s2;
cout<<si<<endl;
strings3=si;
cout<<s3<<endl;
cout?(si=s3)?endl;
s3[0]='H';
cout<<s3<<endl;
cout<<(si>s3)<<endl;
cout<<si.length()<<endl;
cout?(si=s3)?endl;
cout<<(strcasecmp(si.c_str(),
s3.c_str())二=0)<<endl;
cout<<sizeof(si)?endl;
FILE*fp=fopen("string.txt〃,〃w〃);
//fwrite(&s3,sizeof(s3),1,fp);
fwrite(s3.c_str(),sizeof(char),
s3.length(),fp);
fclose(fp);
return0;
完整版學(xué)習(xí)資料分享
WORD完整版--可編輯…-教育資料分享
第二課類和對(duì)象
一、什么是對(duì)象
2.程序就是一組對(duì)象,對(duì)象之間通過消息交換信息
3.類就是對(duì)對(duì)象的描述和抽象,對(duì)象就是類的具體化和實(shí)例化
二、通過類描述對(duì)象
屬性:姓名、年齡、學(xué)號(hào)
行為:吃飯、睡覺、學(xué)習(xí)
類就是從屬性和行為兩個(gè)方面對(duì)對(duì)象進(jìn)行抽象。
三、面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)
現(xiàn)實(shí)世界虛擬世界
對(duì)象->抽象->類->對(duì)象
—UML
3.研究設(shè)計(jì)模式,GOF
四、類的基本語法
class類名{
);
如
classStudent{
);
一一屬性
class類名{
類型成員變量名;
);
如
classStudent{
stringm_name;
intm_age;
);
_一行為
class類名{
返回類型成員函數(shù)名(形參表){
函數(shù)體;
)
);
如
classStudent{
--完整版學(xué)習(xí)資料分享--
WORD完整版?一可編輯--教育資料分享
stringm_name;
intm_age;
voideat(conststringfefood){
)
);
1)公有成員:public,誰都可以訪問。
2)私有成員:private,只有自己可以訪問。
3)保護(hù)成員:protected,只有自己和自己的子類可以訪問。
4)類的成員缺省訪控屬性為私有,而結(jié)構(gòu)的成員缺省訪控屬性為公有。
例子:
Winclude<iostream>
usingnamespacestd;
classStudent{
private:〃聲明為私有部分
stringm_name;
intm_age;
public:〃聲明為私有部分
voideat(conststring&food){
cout<<m_age<<〃歲的〃<<m_name
<<〃同學(xué)正在吃〃<Xfood?z,o'?endl;
}
voidsetName(conststring&name){〃為接口
if(name==〃2〃)
cout<〈〃你才〃?name<<〃!〃<<endl;
else
m_name=name;
}
voidsetAge(intage){〃為接口
if(age<0)
cout〃無效的年齡!〃?endl;
else
m_age=age;
}
);
intmain(void){
Studentstudent;
student.setName("2");〃你才2
student.setAge(-100);〃無效年齡
student.setName(〃張飛〃);〃將其賦值給成員變量m_name
student.setAge(20);〃將其賦值給成員變量m_age
student,eat(〃包子〃);〃20歲的張飛同學(xué)正在吃包子
return0;
)
完整版學(xué)習(xí)資料分享
WORD完整版--可編輯…-教育資料分享
class{
類名(行參表){
構(gòu)造函數(shù)體;
)
);
當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),構(gòu)造函數(shù)會(huì)自動(dòng)被執(zhí)行,其參數(shù)來自構(gòu)造實(shí)參。
6.構(gòu)造函數(shù)可以通過構(gòu)造參數(shù)實(shí)現(xiàn)重載。
7.如果一個(gè)類沒有定義任何構(gòu)造函數(shù),那么系統(tǒng)就會(huì)缺省地為其提供一個(gè)無參構(gòu)造函
數(shù),該構(gòu)造函數(shù)對(duì)于基本類型的成員變量不做初始化,對(duì)于類類型的成員變量,調(diào)用
其相應(yīng)類型的無參構(gòu)造函數(shù)初始化。
分配內(nèi)存->調(diào)用構(gòu)造函數(shù)-〉調(diào)用類類型成員的構(gòu)造函數(shù)->構(gòu)造函數(shù)的代碼
class類名{
類名(.?.):初始化表{
構(gòu)造函數(shù)體
)
);
constintx=100;
x=100;
int&a=b;
a=b;
1)如果類中含有常量或引用型的成員變量,必須通過初始化表對(duì)其初始化。
2)成員變量的初始化順序僅于其被聲明的順序有關(guān),而與初始化表的順序無關(guān)。
classA{
public:
A(char*psz):m_str(psz),
m_len(m_str.length()){}
private:
size_tm_len;
stringm_str;
}
例子1:類的聲明與定義以及使用可以不在一個(gè)文件
#ifndef_S_H
#define_S_H
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
#include<string>
usingnamespacestd;
//聲明Student類
classStudent{
public:
Student(conststring&name=〃〃,intage=0);
voideat(conststring&food);
private:
stringm_name;
intm_age;
};
ttendif//_S_H
ttinclude<iostream>
usingnamespacestd;
#include〃s.h〃
//實(shí)現(xiàn)Student類
Student::Student(conststring&name/*=〃〃*/,
intage/*=0*/):m_name(name),
m_age(age){}
voidStudent::eat(conststring&food){
cout<<m_name<<,z,〃<<m_age<<,z,〃<<food
<<endl;
這是main,cpp文件:
#include〃s.h〃
//使用Student類
intmain(void){
Students(“張飛”,25);
s.eat(“包子〃);
return0;
例子2:不同的構(gòu)造函數(shù)
ttinclude<iostream>
usingnamespacestd;
classA{
public:
A(inta){}
);
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
classStudent{
private:
stringm_name;
intm_age;
Am_a;〃類類型的成員變量
public:
voideat(conststring&food){
cout<<m_age<<〃歲的〃<<m_name
<<〃同學(xué)正在吃〃<<food<<"。"<<endl;
}
//void_ZN7Student3eatERKSs(Student*this,
//conststring&food){
//cout<<this->m_age<<〃歲的”<〈this->m_nanie
//<<〃同學(xué)正在吃〃《food?\/z?endl;
//}〃這是計(jì)算機(jī)中編譯的樣子
voidsetName(conststring&name){
if(name==〃2〃)
cout<<〃你才〃?name<<"”<<endl;
else
m_name=name;
}
voidsetAge(intage){
if(age<0)
cout<〈〃無效的年齡!〃<<endl;
else
m_age=age;
〃如果同時(shí)有多種構(gòu)造函數(shù)存在,則根據(jù)構(gòu)造參數(shù)來確定調(diào)用哪個(gè)構(gòu)造函數(shù),既構(gòu)造函數(shù)可以通過
構(gòu)造參數(shù)實(shí)現(xiàn)重載
//構(gòu)造函數(shù)
Student(conststring&name,intage):
m_a(100){
mname=name;
m_age=age;
//無參構(gòu)造
Student(void):m_a(100){〃沒有參數(shù)
m_name=〃沒名〃;
m_age=0;
//單參構(gòu)造
完整版學(xué)習(xí)資料分享
WORD完整版--可編輯--教育資料分享
Student(conststring&name):m_a(100),
m_name(name),m_age(0){
m_name二〃哈哈”;
}
);
intmain(void){
Studentsi(“張飛”,25);
si.eat(〃包子〃);
//_ZN7Student3eatERKSs(&sl,〃包子〃);〃編譯器中的樣子
Students2=Student("趙云",22);
s2.eat(〃燒餅〃);
//_ZN7Student3eatERKSs(&s2,〃燒餅〃);〃編譯器中的樣子
Students3;〃調(diào)用的無參構(gòu)造
s3.eat(〃煎餅果子〃);
Student*s4=newStudent(〃關(guān)羽〃,30);〃調(diào)用有參構(gòu)造,分配內(nèi)存,并初始化
s4->eat(〃烤鴨〃);〃當(dāng)訪問地址(指針或迭代器)的成員或數(shù)據(jù)時(shí),用->
deletes4;
Student&s5=*newStudent();〃調(diào)用無參構(gòu)造初始化
s5.eat("面條");〃當(dāng)訪問直接對(duì)象的成員或數(shù)據(jù)時(shí),用”
delete&s5;
Studentsal[3]={si,s2};〃用si與s2給數(shù)組初始化,但第三個(gè)元素沒有賦值
sal[0].eat("KFC");〃25歲的張飛同學(xué)正在吃KFC
sal[1].eat("KFC");//22歲的趙云同學(xué)正在吃KFC
sal[2],eat("KFC");〃。歲的無名同學(xué)正在吃KFC
Student*sa2=newStudent[3]{si,s2};//c++2011支持
sa2[0].eat("KFC");
sa2[l].eat("KFC");
sa2[2].eat("KFC");
delete[]sa2;
Students6("劉備");〃調(diào)用單參構(gòu)造
s6.eat("米飯”);〃
return0;
練習(xí):實(shí)現(xiàn)一個(gè)Clock類支持兩種工作模式,計(jì)時(shí)器和電子鐘。
00:01:00
14:05:37
--完整版學(xué)習(xí)資料分享--
WORD完整版?一可編輯--教育資料分享
#include<iomanip>
cout<<setw(4)<<setfill('O')<<12;
0012
Clock
時(shí)、分、秒
走-顯示、滴答
練習(xí)答案:
^include<iostream>
□include<iomanip>
usingnamespacestd;
classClock{
public:
Clock(booltimer=true):
m_hour(0),m_min(0),m_sec(0){
if(!timer){
time_tt=time(NULL);
tm*local=localtime(&t);
m_hour=local->tm_hour;
m_min=local->tm_min;
m_sec=local->tm_sec;
)
)
voidrun(void){
for(;;){
show();
tick();
}
)
private:
voidshow(void){
cout?'\r'?setfill('0')
?setw(2)?m_hour
?setw(2)?m_min
?setw(2)?m_sec?flush;
//printf("\r%02d:%02d:%02d”,m_hour,
//m_min,m_sec);
)
voidtick(void){
sleep(1)
if(++m_sec==60){
m_sec=0;
if(++m_min==60){
m_min=0;
if(++m_hour==24)
完整版學(xué)習(xí)資料分享
WORD完整版--可編輯?一教育資料分享
m_hour=0;
)
)
)
intm_hour;
intm_min;
intm_sec;
);
intmain(void){
Clockclock(false);
clock,run();
return0;
)
一■完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯--教育資料分享
五、this指針
1.一般而言,在類的構(gòu)造函數(shù)或成員函數(shù)中,關(guān)鍵字this表示一個(gè)指針,對(duì)于構(gòu)造
函數(shù)而言,this指向正在被構(gòu)造的對(duì)象,對(duì)于成員函數(shù)而言,this指向調(diào)用該函數(shù)
的對(duì)象。
1)在類的內(nèi)部區(qū)分成員變量。
2)在成員函數(shù)中返回調(diào)用對(duì)象自身。
3)在成員函數(shù)內(nèi)部通過參數(shù)向外界傳遞調(diào)用對(duì)象自身,以實(shí)現(xiàn)對(duì)象間交互。
老-問題-》學(xué)
師〈-答案-生
classA{
Bm_b;
);
classB{
Am_a;
);
sizeof(A)//error
classC{
Cm_c;
);
例子1:
ttinclude<iostream>
usingnamespacestd;
classA{
public:
A(intdata):data(data){
cout<<〃構(gòu)造:"?this<<endl;
//this->data=data;
)
voidfoo(void){
cout<<〃foo:〃<<this<<endl;
cout<<this->data<<endl;
}
intdata;
};
intmain(void){
Aa(1000);〃創(chuàng)建對(duì)象調(diào)用了構(gòu)造函數(shù),并輸出this的地址,輸出“構(gòu)造:
Oxbf9b24d8”
cout?"main:"?&a?'endl;〃輸出該對(duì)象的地址,輸出“main:Oxbf9b24d8”
a.foo0;〃該對(duì)象調(diào)用foo函數(shù),輸出this的值,以及輸出this->data的值,
輸出“foo:0xbf9b24d81000w
A*pa=newA(1000);〃創(chuàng)建對(duì)象調(diào)用構(gòu)造函數(shù),輸出this的地址,輸出“構(gòu)造:0x95cc008”
cout<<z,main:?pa?endl;〃輸出該對(duì)象的地址,輸出"main:0x95cc008w
pa->foo();〃該對(duì)象調(diào)用foo函數(shù),輸出this以及this->data的值,輸出"foo:
--完整版學(xué)習(xí)資料分享--
WORD完整版--可編輯…-教育資料分享
0x95cc0081000”
deletepa;
}
例子2:
ttinclude<iostream>
usingnamespacestd;
classCounter{
public:
Counter(void):m_data(0){}
Counter&inc(void){〃返回的是一個(gè)別名,不加&的話,返回的就是一個(gè)拷貝
++m_data;
return*this;
)
voidprint(void){
cout<<m_data?endl;
}
private:
intm_data;
);
intmain(void){
Counterc;
//c.inc0;
//c.inc();
//c.inc0;
c.incO.incO.inc();〃函數(shù)返回的是一個(gè)別名,是一個(gè)左值,可以用來調(diào)用函數(shù)
c.print();//輸出為3,如果前面的函數(shù)不加&,返回的只是拷貝,輸出為1。
return0;
}
例子3:學(xué)生與老師
#include<iostream>
usingnamespacestd;
classStudent;〃因?yàn)樵赥eacher中會(huì)用到Student,所以提前聲明一下
完整版學(xué)習(xí)資料分享
WORD完整版--可編輯…-教育資料分享
classTeacher{
public:
voideducate(Student*s);〃可以聲明在類的內(nèi)部,定義在類的外部
voidreply(conststring&answer){
m_answer=answer;
}
private:
stringm_answer;
);
classStudent{
public:
voidask(conststring&question,Teacher*t){
cout<<〃問題:〃<<question<<endl;
t->reply("不知道?!?;
)
);
voidTeacher::educate(Student*s){
s->ask(〃什么是this指針?〃,this);〃將問題question和Teacher類變量的地址作為參數(shù)傳
遞給Student類中的ask成員函數(shù),并在ask函數(shù)中得到一個(gè)值作為參數(shù)傳遞給Teacher類中的replay
函數(shù),將值賦給m_answer,最后
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025土地流轉(zhuǎn)合同范文
- 養(yǎng)豬產(chǎn)業(yè)鏈一體化2025年度合作協(xié)議模板3篇
- 2025城市綜合體物業(yè)租賃合同
- 2025服務(wù)合同香港及境外股市投資咨詢服務(wù)協(xié)議
- 2025年度農(nóng)村房屋產(chǎn)權(quán)轉(zhuǎn)讓及配套設(shè)施移交合同2篇
- 二零二五年度企業(yè)培訓(xùn)與發(fā)展公司管理服務(wù)協(xié)議3篇
- 二零二五年度農(nóng)副產(chǎn)品電商平臺(tái)入駐合作協(xié)議3篇
- 2025年度智能化公廁建設(shè)與運(yùn)營管理承包施工合同書模板3篇
- 二零二五農(nóng)村宅基地買賣與農(nóng)村土地整治與生態(tài)保護(hù)合同
- 二零二五年度農(nóng)民工工資支付委托及勞務(wù)合同管理協(xié)議
- 穴位貼敷護(hù)理培訓(xùn)
- 腰椎間盤突出癥護(hù)理查房課件
- DB45T 2866-2024 靈芝菌種制備技術(shù)規(guī)程
- 2024年度區(qū)塊鏈軟件產(chǎn)品知識(shí)產(chǎn)權(quán)共享協(xié)議3篇
- 人教版九年級(jí)上學(xué)期物理期末復(fù)習(xí)(壓軸60題28大考點(diǎn))
- 人教版(2024版)七年級(jí)上冊(cè)英語期末模擬測(cè)試卷(含答案)
- 2024年度企業(yè)環(huán)境、社會(huì)及治理(ESG)咨詢合同6篇
- 幼兒園中班美術(shù)活動(dòng)《美麗的線條》課件
- 2024年01月22474旅游工作者素質(zhì)修養(yǎng)期末試題答案
- 計(jì)量經(jīng)濟(jì)學(xué)知到智慧樹章節(jié)測(cè)試課后答案2024年秋云南財(cái)經(jīng)大學(xué)
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院院長工作職責(zé)
評(píng)論
0/150
提交評(píng)論