C與C++的不同
C語言是函數(shù)處理數(shù)據(jù)容为,缺點(diǎn)在于沒有提供足夠的關(guān)鍵字而導(dǎo)致數(shù)據(jù)是全局的坎背。這樣會(huì)對(duì)程序有影響寄雀。
C++是面向?qū)ο笳Z言,數(shù)據(jù)和處理這些數(shù)據(jù)的函數(shù)都包在一起懂更,成為class.class幾乎等同于在C所學(xué)過的struct
C++數(shù)據(jù)和函數(shù)
以復(fù)數(shù)為例急膀,complex有實(shí)部和虛部。實(shí)部和虛部為數(shù)據(jù)卓嫂,運(yùn)算符為函數(shù)。數(shù)據(jù)可以有很多分行瑞,函數(shù)只有一份悍募。
string:字符串是一個(gè)指針。
object Based:是沒有指針的(complex)面對(duì)的是單一class的設(shè)計(jì)
object oriented:面對(duì)的是多重classes的設(shè)計(jì)洋魂,classes和classes之間的關(guān)系喜鼓。
基本形式
包括頭文件,主程序庄岖,標(biāo)準(zhǔn)庫
#ifndef?_COMPLEX_????????//防衛(wèi)式聲明,防止重復(fù)include
#define?_COMPLEX_
#include <cmath>? ? ? ? //foward?declarations
? ? class?ostream;
? ? class?complex;
class?complex????????????//class?declarations
{
? ? ...
}
complex:function..????????//class?definition
#endif
模板
如果兩個(gè)函數(shù)體中的其他部分全都一樣就只有返回類型不同時(shí)心剥,重復(fù)定義幾乎完全一樣的函數(shù)體是非常繁瑣且容易出錯(cuò)的。所以C++上就有了模板的概念优烧。
Access level
public:可以被該類中的函數(shù)、子類的函數(shù)又沾、友元函數(shù)熙卡、該類的對(duì)象訪問。
private:只能由該類中的函數(shù)以及友元函數(shù)訪問滑燃。(數(shù)據(jù)封裝喂柒,不想被外界使用的函數(shù)禾嫉。
protect:可以由該類中的函數(shù)、子類的函數(shù)以及友元函數(shù)訪問熙参。
構(gòu)造函數(shù)
名稱一定要與類名稱相等,沒有返回類型
comlex(double?r=0,double?i=0)????????//(double?r=0,double?i=0)為默認(rèn)實(shí)參昭娩。
? ? :re(r),im(i)????????//Initialization?list.
? ? {}
構(gòu)造函數(shù)可以有很多個(gè)--overloading(重載)黍匾,但是上面的構(gòu)造函數(shù)不可以與下面的構(gòu)造函數(shù)同時(shí)出現(xiàn)。
complex()?:re(0),im(0){}
因?yàn)閏omplex c1;調(diào)用時(shí)也可以兩個(gè)都可以調(diào)用磕诊,都直接賦了初始值纹腌。所以編譯器會(huì)報(bào)錯(cuò)。
把構(gòu)造函數(shù)放在private區(qū)里的寫法叫做Singleton
類的成員函數(shù)
類的成員函數(shù)的原型寫在類里莱褒,聲明函數(shù)的參數(shù)表和返回類型。而定義可以在類里也可以在類外广凸。一般都在類的外面。函數(shù)在類里面聲明谅海,在類外部調(diào)用時(shí)應(yīng)該以(類的名稱::函數(shù))來調(diào)用。
成員函數(shù)在操作符重載時(shí)會(huì)有隱藏的this參數(shù)企蹭,如果在類里面聲明了comlex& operator += (const complex&);
則定義時(shí)就可以有this的返回值智末。this這個(gè)函數(shù)就在complex& operator +=(this,const complex&)或者在后面。
inline complex&
complex::operator+=(comst complex& r)
{
? ? return _doapl(this,r);
}
inline
又稱內(nèi)聯(lián)函數(shù)送漠。使用內(nèi)聯(lián)函數(shù)的主要原因是加快運(yùn)行效率由蘑。所有函數(shù)前都可以加inline,但是會(huì)不會(huì)真正成為內(nèi)聯(lián)函數(shù)由編譯器決定尼酿。在函數(shù)定義前加inline只是給編譯器一個(gè)建議。
const
我們希望定義一個(gè)變量涎永,它的值不能被改變鹿响。這時(shí)我們可以用const。
int?re;
int?*const?r=?&re;????????//不能改變r(jià)的值
const?int?re1?=?42????????//不能改變r(jià)e1的值
const?int?*r2=?&re1????????//不能改變r(jià)2的值
不會(huì)改變數(shù)據(jù)內(nèi)容的都要加const
參數(shù)傳遞以及返回都盡量用引用妈倔。如果函數(shù)不用改變引用形參的值绸贡,最好將其聲明為常亮引用const.(關(guān)于引用,根據(jù)個(gè)人理解寫在了博客里恃轩。)
在函數(shù)內(nèi)新創(chuàng)建的,執(zhí)行完畢后數(shù)據(jù)小時(shí)松忍,但傳回應(yīng)用的話筷厘,是一個(gè)空的數(shù)據(jù)宏所。所以這種情況下不能返回引用摊溶。
friend(友元)
private的數(shù)據(jù)除了該類中的函數(shù)之外,友元也可以訪問霞玄。友元就說明是類函數(shù)的朋友拉岁,朋友之間可以共享資源。所以可以自由取得private的數(shù)據(jù)喊暖。
private:
? ? double?re,im;
? ? friend?complex&?_doapl(complex*,?const?complex&);
? ? inline?complex&?_doapl(complex*?ths,?const?complex&?r)
{
? ? ths?->re?+=r.re;????????//可以看見獲取了private里面的數(shù)據(jù)?re與im
? ? ths?->im?+=r.im;
? ? return?*ths;
}
相同class的各個(gè)objects互為友元。
形參與實(shí)參
定義時(shí)的參數(shù)稱為形參狞尔,調(diào)用時(shí)用的參數(shù)稱為實(shí)參巩掺。實(shí)參是形參的初始值。實(shí)參的數(shù)量要與形參相同禽车。每個(gè)形參的類型都要聲明刊殉,即使兩個(gè)類型相同州胳。
void?n(int?a,int?b)??//a和b?就是形參。
{
? ? int?c;
? ? c=a+b;
? ? return?c;
}
int?main()
{
? ? int?sum=n(3,5)????//3和5就是實(shí)參
? ? std::cout<<"3+5="<<sun<<std::endl;
return?0;
}