c++個(gè)人筆記總結(jié)_第1頁
c++個(gè)人筆記總結(jié)_第2頁
c++個(gè)人筆記總結(jié)_第3頁
c++個(gè)人筆記總結(jié)_第4頁
c++個(gè)人筆記總結(jié)_第5頁
已閱讀5頁,還剩102頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論