物件陣列和物件指標
類實際是一種自定義資料型別,可以用它來定義各種不同的物件。物件陣列就是用類定義的陣列,它的每個元素都是物件。
也可以定義物件的指標,用指標指向類物件。物件指標與結構指標的訪問方法相同,即用: ->成員變數或成員函式 (*指標).成員變數或成員函式 兩種操作符訪問其所指物件的成員。
說明:
1)、要定義物件陣列的類必須有不需要引數的建構函式,包括以下幾種情況:
2)、沒有定義任何建構函式的類可以定義物件陣列,因為C++會為這種類產生一個預設建構函式。
3)、如果一個類同時具有無參建構函式和全部引數都有預設值的建構函式,也可以定義物件陣列。無參建構函式在定義物件陣列時擁有優先權。但在定義無參物件時,將產生二義性
4)、如果一個類只有需要引數的建構函式(不包括全部引數都有預設值的情況),就不能定義其物件陣列。
//this,當前物件的指標
//函式是共享的,必須要有能夠標識當前物件是誰的辦法
class Student
{
public:
void mprintf(){
cout << "name:" << name << "--------" << "age:" << age << endl;
}
//常函式,修飾的是this
//既不能改變指標的值,又不能改變指標指向的內容
//const Student* const this
void myprint() const{
printf("%#x\n", this);
//改變屬性的值
//this->name = "xiaofang";
//改變this指標的值
//this = (Student*)0x00009;
cout << this->name << "," << this->age << endl;
}
//覆蓋該類的預設建構函式
Student(char*name, int age){
this->name = name;
this->age = age;
cout << "建構函式" << endl;
}
//解構函式
~Student(){
cout << "解構函式" << endl;
}
void setName(char* name){
this->name = name;
}
char* getName(){
return this->name;
}
private:
char* name;
int age;
};
void func(){
Student s("xiaoMing", 15);
const Student s2("xiaoFang", 18);
//s2.mprintf(); //常量物件只能呼叫常量函式,不能呼叫非常量函式
//常函式,當前物件不能被修改,防止資料成員被非法訪問
s.mprintf();
s.myprint(); //非常量物件既可以呼叫常量函式,也可以呼叫非常量函式
}
複製程式碼
物件的生存期
物件的生存期:指物件從它被建立開始到被銷燬之間的時間。包括靜態生存期和動態生存期兩種型別。
靜態生存期:是指物件具有與程式執行期相同的生存期,這類物件一旦被建立後,它將一直存在,直到程式執行結束時才被銷燬。
動態生存期:指區域性物件的生存期,區域性物件具有塊作用域,它的生存期是從它的定義位置開始,遇到離它最近的“}”就結束了。
全域性物件和靜態物件具有靜態生存期。
各種物件的構造與析構
區域性物件:
宣告期侷限於定義它的語句塊
程式執行到其定義處構造
語句塊結束時析構
全域性物件:
生命期與程式相同
全域性物件在呼叫main()之前構造
全域性物件在呼叫main()之後析構
不同檔案定義的全域性物件,其構造順序不定
區域性靜態物件:
程式第一次執行到其定義程式碼處構造
呼叫main()之後析構
區域性靜態物件僅構造一次
說明:
生存期與物件的構造順序和銷燬順序密切相關;
區域性物件和靜態物件的構造順序與它們在塊中的宣告順序相同,即在塊中先宣告的就先構造,塊即物件 定義所在的一對{}所框定的程式碼區域;
所有的全域性物件在main之前構造,在main 結束之後銷燬;
物件資料成員(包括物件成員)的構造順序與其在類中的宣告順序相同,而與它們在建構函式的初始化列表中的順序無關;
在物件生存期結束時,具有相同生存期的物件將按與構造的相反順序銷燬;
非靜態物件的生存期與其作用域是一致的,而靜態物件的生存期則長於其作用域,程式結束時靜態物件的生存期才結束。