更新時間:2018-01-23 來源:黑馬程序員 瀏覽量:
16、要想共享初始化的過程,可以先定義一個共享成員函數(shù),然后每個構(gòu)造函數(shù)都調(diào)用之。
17、C++提供的默認(rèn)構(gòu)造函數(shù)是個無參構(gòu)造函數(shù),它僅負責(zé)創(chuàng)建對象,而不做任何初始化工作。只要一個類定義了一個構(gòu)造函數(shù),C++就不再提供默認(rèn)的構(gòu)造函數(shù)。(如果此時還想要無參構(gòu)造函數(shù),則需要自己定義)與變量定義類似,在用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對象時,如果創(chuàng)建的是全局對象或靜態(tài)對象,則對象的位模式全為0,否則對象值是隨機的。
創(chuàng)建對象的唯一途徑是調(diào)用構(gòu)造函數(shù)。
靜態(tài)對象只被構(gòu)造一次,所有全局對象都在主函數(shù)main()之前被構(gòu)造。
18、面向?qū)ο蟪绦蛟O(shè)計主要是兩方面:面向?qū)ο髴?yīng)用程序設(shè)計,類庫的設(shè)計。面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵是如何抽象和分類。
19、全局變量、靜態(tài)變量、常量存放在全局?jǐn)?shù)據(jù)區(qū),所有類成員函數(shù)和非類成員函數(shù)代碼存放在代碼區(qū),為運行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等存放在棧區(qū),余下的空間都被作為堆區(qū)。
void* malloc(size_t);和void free(void*);在頭文件malloc.h中聲明。而操作符new和delete是C++的一部分,無須包含頭文件,它們都是從堆中分配和釋放內(nèi)存塊,但是具體操作上兩者有很大的區(qū)別。
操作堆內(nèi)存時,如果分配了內(nèi)存,就有責(zé)任回收它,否則運行的程序?qū)斐蓛?nèi)存泄露,這與函數(shù)中棧區(qū)分配局部變量有本質(zhì)的區(qū)別。
從C++來說,不使用malloc()函數(shù)一個原因是,它在分配空間的時候不能調(diào)用構(gòu)造函數(shù)。類對象的建立是分配空間,構(gòu)造結(jié)構(gòu)及初始化的三位一體,它們統(tǒng)一由構(gòu)造函數(shù)來完成。而new和delete在創(chuàng)建對象和刪除對象時,便同時調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。
定義對象數(shù)組,在生成對象時,依次調(diào)用構(gòu)造函數(shù)(如依次生成ps[0],ps[1],ps[2]......),由于分配數(shù)組時,new的格式是類型后面跟[元素個數(shù)](student* ps=new student[10]),不能再跟構(gòu)造函數(shù)參數(shù),所以從堆上分配對象數(shù)組,只能調(diào)用默認(rèn)的構(gòu)造函數(shù),不能調(diào)用其它任何構(gòu)造函數(shù),如果該類沒有默認(rèn)的構(gòu)造函數(shù),則分配對象數(shù)組失敗。Delete[] ps告訴C++將要該指針指向的是一個數(shù)組,如果在[]中填上了長度信息,C++將忽略。
20、拷貝構(gòu)造函數(shù)
當(dāng)構(gòu)造函數(shù)的參數(shù)為自身類的引用時,這個構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)。拷貝構(gòu)造函數(shù)的功能是用一個已有對象初始化一個正在建立的同類對象。
拷貝構(gòu)造函數(shù)定義形式如下:
Student(student& s)
27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地
Person p1;
p2=p1;
27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地
27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地
在創(chuàng)建對象p2時,對象p1被復(fù)制給了p2,同時資源也作了復(fù)制,此時p1和p2指向不同的資源,這稱為深拷貝。
27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地
如果你的類需要析構(gòu)函數(shù)來析構(gòu)資源,則它也需要一個拷貝構(gòu)造函數(shù)。C++提供的默認(rèn)函數(shù)只是對對象進行淺拷貝復(fù)制。如果對象的數(shù)據(jù)成員包括指向堆空間的指針,就不能使用這種拷貝方式,要自己定義拷貝構(gòu)造函數(shù),為創(chuàng)建的對象分配堆空間。
21、靜態(tài)成員
這種屬于類的一部分,但既不適用于普通成員函數(shù),也不適用于全局變量表示的數(shù)據(jù),我們用靜態(tài)成員來表示。
一般情況下,我們在類的內(nèi)部實現(xiàn)中對靜態(tài)數(shù)據(jù)成員進行定義(在類的內(nèi)部實現(xiàn)中分配空間和初始化)。
Int student::noOfstudent=0;
靜態(tài)數(shù)據(jù)成員一般用于:
標(biāo)志一個事件的發(fā)生與否,某個特定的指針,變化的對象等。
靜態(tài)成員函數(shù)定義是類的內(nèi)部實現(xiàn),屬于類的一部分,定義位置同一般成員函數(shù)。與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)與類相聯(lián)系,不與類的對象相聯(lián)系,所以訪問靜態(tài)成員函數(shù)時,不需要對象。如果用對象去引用靜態(tài)成員函數(shù),只是用其類型。
#include
using namespace std;
class Student
{
public:
static int number()
{
return noOfStudents;
}
protected:
char name[40];
static int noOfStudents;
};
int Student::noOfStudents=1;
int main()
{
Student s;
cout<<s.number()<<endl;< p="">
cout<<student::number()<<endl;< p="">
return 1;
}
一個靜態(tài)成員函數(shù)不與任何對象相聯(lián)系,故不能對非靜態(tài)成員進行默認(rèn)訪問。靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是靜態(tài)成員函數(shù)沒有this指針。 這也就是靜態(tài)成員函數(shù)與當(dāng)前對象無聯(lián)系的原因。
*********************************
class Sc
{
public:
void nsfn(int a);//類同聲明成Sc::nsfn(Sc* this,int a)
static void sfn(int a); //無this指針
//...
};
void f(Sc& s)
{
s.nsfn(10); //C++編譯成Sc::nsfn(&s,10)
s.sfn(10); //C++編譯成Sc::sfn(10)
}
靜態(tài)的static一詞與靜態(tài)存儲類的static是兩個概念,一個論及類,一個論及內(nèi)存空間的位置及作用域,所限定以要區(qū)分靜態(tài)對象和靜態(tài)成員。
本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員C/C++培訓(xùn)學(xué)院
首發(fā):http://c.itheima.com/