目錄
三、再談建構式和解構式
1.呼叫構造和解構式的順序
2.物件的賦值
3.物件的復制
4.物件陣列
5.物件指標
5.1.指向物件的指標
5.2.指向物件成員的指標
三、再談建構式和解構式
1.呼叫構造和解構式的順序
呼叫建構式的順序和呼叫解構式的順序相反
呼叫建構式時,先基類呼叫,再到派生類
呼叫解構式時,先派生類呼叫,再基類呼叫
非常類似堆疊的結構,可以類比進行記憶🙂
可以看下面的圖:

簡單代碼樣例:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class student
{
public:
student(){cout<<"student建構式1\n";}
~student(){cout<<"student解構式1\n";}
};
class teacher:public student
{
public:
teacher(){cout<<"teacher建構式2\n";}
~teacher(){cout<<"teacher解構式2\n";}
};
class boss:public teacher,public student
{
public:
boss(){cout<<"boss建構式3\n";}
~boss(){cout<<"boss解構式3\n";}
};
int main()
{
boss b;
return 0;
}
結果:

總結:全域或靜態物件的解構式呼叫順序與他們建立順序(建構式呼叫的順序)相反,
2.物件的賦值
如果一個類定義了多個物件時,則這些同類的物件之間可以互相賦值,即將一個物件中所有資料成員的值一一賦給另一個同類物件的對應成員,
物件之間的賦值也是通過賦值運算子“=”進行的,
物件賦值的一般形式為
物件名1 = 物件名2;
【例】
student stu1,stu2;//定義兩個同類的物件
stu1 = stu2; // 將一個物件的所有資料成員賦給另一個物件的所有資料成員
注意:
① 物件名1和物件名2必須屬于同一個類
② 物件的賦值只對其中的資料成員賦值,而不對成員函式賦值
③ 類的資料成員中不能包括動態分配的資料,否則在賦值時可能出現嚴重后果
3.物件的復制
如果需要用到多個完全相同的物件,或將物件在某一瞬時的狀態保留下來,可使用物件的復制機制,即用一個已有的物件快速地復制出多個完全相同的物件,
- 物件復制實際上是在建立物件時呼叫一個特殊的建構式,即復制建構式
- 它的作用就是 將實參物件的各成員值一一賦給新的物件中對應的成員,
- 復制建構式也是建構式,但它只有一個引數,這個引數必須是本類的物件,而且采用物件的參考的形式,
注意:
- 呼叫復制建構式
- 引數只有一個,且型別為同種物件的參考型別,
- 若用戶未定義復制建構式,系統會自動提供一個默認的復制建構式,用來復制每個資料成員,
物件復制的形式有:
1.類名 物件2(物件1);
2.類名 物件名1 = 物件名2;
Box box2=box1; //用box1初始化box2
//或Box box2(box1);
復制與賦值的區別:
物件的賦值是對一個已經存在的物件賦值,而物件的復制則是從無到有地建立一個新物件,并使它與一個已有的物件完全相同(包括物件的結構和成員的值),
賦值強調已經存在物件,賦值強調重新創建,
4.物件陣列
陣列中每個元素的型別都為物件型別,創建物件陣列型別時每個物件都會呼叫其自己的建構式,
student stu[20];//創建一個student物件陣列,大小為20,每個元素都為student物件型別
不同引數數目的初始化:
一個引數時:
可以在等號后面的花括號里面提供相同數目(和陣列長度一樣)的實參
student stu[3] = {1,2,3};//student引數數目為一個
多個引數時:
需要在花括號里面呼叫建構式,在建構式里面提供實參,
//以兩個引數為例
student stu[2] = {student(1,2),student(2,3)};
//創建長度為2的物件陣列
5.物件指標
5.1.指向物件的指標
宣告形式:
類名 *物件指標名
例:加入已經定義一個student類
student *sptr;
student s;
sptr = &s;//將s的初始地址賦給sptr
通過物件指標訪問物件成員:
| *指標變數 | 指標變數所指向的物件 |
| (*指標變數).成員變數 | 指標變數所指向的物件中的成員變數 |
| 指標變數->成員變數 | 指標變數所指向的物件中的成員變數 |
| (*指標變數).成員函式 | 呼叫指標變數所指向的物件中的成員函式 |
| 指標變數->成員函式 | 呼叫指標變數所指向的物件中的成員函式 |
5.2.指向物件成員的指標
- 指向物件資料成員的指標:
形式:
資料型別名 *指標變數名;
例:假設已經定義student類,其中有age資料成員
student s(16);
int *p;
p = &s.age;
cout<<*p<<endl;//輸出age
- 指向物件成員函式的指標
形式:
資料型別名 (類名∷*指標變數名)(引數表列);
編譯系統要求指標變數的型別必須在下面3個方面與函式的型別相匹配:
①函式引數的型別和引數個數;
②函式回傳值的型別;
③所屬的類,
使指標變數指向一個公用成員函式的一般形式為
指標變數名=&類名∷成員函式名;
#include <iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);
int hour;
int minute;
int sec;
void get_time( ); //宣告公有成員函式
};
Time∷Time(int h,int m,int s)
{
hour=h;
minute=m;
sec=s;
}
void Time∷get_time( ) //定義公有成員函式
{
cout<<hour<<″:″<<minute<<″:″ <<sec<<endl;
}
int main( )
{
Time t1(10,13,56);
int *p1=&t1.hour;
cout<<*p1<<endl;
t1.get_time( );
Time *p2=&t1;
p2->get_time( );
void (Time∷*p3)( ); //定義p3為指向Time一個公有成員函式的指標變數
p3=&Time∷get_time; //將p3賦為Time的get_time地址
(t1.*p3)( );
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286438.html
標籤:其他
上一篇:零基礎入門 Unity 之 UGUI 詳解專欄 | 尋找C站寶藏
下一篇:“軟體測驗”就需要這么學!
