資訊網(wǎng)站模板周口seo公司
提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、實(shí)例化概念
- 二、對(duì)象大小
- 1.對(duì)象存儲(chǔ)
- 2.內(nèi)存對(duì)齊規(guī)則
- 總結(jié)
前言
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、實(shí)例化概念
? ?類類型在物理內(nèi)存中創(chuàng)建對(duì)象的過(guò)程,稱為類實(shí)例化出對(duì)象。
? 類是對(duì)象進(jìn)??種抽象描述,是?個(gè)模型?樣的東西,限定了類有哪些成員變量,這些成員變量只
是聲明,沒(méi)有分配空間,?類實(shí)例化出對(duì)象時(shí),才會(huì)分配空間。
? ?個(gè)類可以實(shí)例化出多個(gè)對(duì)象,實(shí)例化出的對(duì)象 占?實(shí)際的物理空間,存儲(chǔ)類成員變量。打個(gè)?
?:類實(shí)例化出對(duì)象就像現(xiàn)實(shí)中使?建筑設(shè)計(jì)圖建造出房?,類就像是設(shè)計(jì)圖,設(shè)計(jì)圖規(guī)劃了有多
少個(gè)房間,房間??功能等,但是并沒(méi)有實(shí)體的建筑存在,也不能住?,?設(shè)計(jì)圖修建出房?,房
?才能住?。同樣類就像設(shè)計(jì)圖?樣,不能存儲(chǔ)數(shù)據(jù),實(shí)例化出的對(duì)象分配物理內(nèi)存存儲(chǔ)數(shù)據(jù)。
在面向?qū)ο缶幊?#xff08;OOP)中,實(shí)例化(Instantiation)是指創(chuàng)建一個(gè)類的實(shí)例的過(guò)程。這個(gè)實(shí)例,也稱為對(duì)象,是類的具體化,擁有類定義的屬性和行為。實(shí)例化使得抽象的類概念成為具有具體數(shù)據(jù)和功能的實(shí)體。
實(shí)例化過(guò)程包括以下幾個(gè)關(guān)鍵點(diǎn):
-
創(chuàng)建對(duì)象:在內(nèi)存中分配空間以存儲(chǔ)對(duì)象的狀態(tài)(成員變量)。
-
初始化:設(shè)置對(duì)象的初始狀態(tài)。這可能涉及到調(diào)用構(gòu)造函數(shù)來(lái)初始化成員變量。
-
分配內(nèi)存:對(duì)象可能在棧上(自動(dòng)存儲(chǔ)期)或堆上(動(dòng)態(tài)存儲(chǔ)期)創(chuàng)建。棧上的對(duì)象在作用域結(jié)束時(shí)自動(dòng)銷毀,而堆上的對(duì)象需要手動(dòng)管理其生命周期。
實(shí)例化的例子:
class MyClass {
public:int value;MyClass(int val) : value(val) {} // 構(gòu)造函數(shù)
};int main() {MyClass obj(10); // 在棧上實(shí)例化對(duì)象,初始化value為10MyClass* ptr = new MyClass(20); // 在堆上實(shí)例化對(duì)象,初始化value為20// 使用obj和ptr// ...delete ptr; // 釋放堆上分配的內(nèi)存return 0;
}
在這個(gè)例子中,我們定義了一個(gè)簡(jiǎn)單的類 MyClass
,它有一個(gè)公有成員變量 value
和一個(gè)構(gòu)造函數(shù)。在 main
函數(shù)中,我們實(shí)例化了兩個(gè) MyClass
對(duì)象:一個(gè)是棧上的對(duì)象 obj
,另一個(gè)是堆上的對(duì)象 ptr
。
實(shí)例化的特點(diǎn):
-
棧上實(shí)例化:對(duì)象的生命周期與創(chuàng)建它的函數(shù)或代碼塊相同。當(dāng)函數(shù)結(jié)束或代碼塊執(zhí)行完畢時(shí),對(duì)象會(huì)被自動(dòng)銷毀。
-
堆上實(shí)例化:對(duì)象的生命周期由程序員控制,需要使用
new
操作符來(lái)創(chuàng)建對(duì)象,并使用delete
來(lái)釋放內(nèi)存。這允許對(duì)象在創(chuàng)建它的函數(shù)之外存活。 -
默認(rèn)構(gòu)造函數(shù):如果沒(méi)有顯式定義構(gòu)造函數(shù),編譯器會(huì)提供一個(gè)默認(rèn)構(gòu)造函數(shù),它不執(zhí)行任何初始化。
-
拷貝構(gòu)造函數(shù):用于創(chuàng)建一個(gè)對(duì)象作為另一個(gè)同類型對(duì)象的副本。如果沒(méi)有定義拷貝構(gòu)造函數(shù),編譯器會(huì)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)。
-
構(gòu)造函數(shù)重載:可以為類定義多個(gè)構(gòu)造函數(shù),它們可以有不同的參數(shù)列表,這允許以不同的方式初始化對(duì)象。
實(shí)例化是面向?qū)ο缶幊讨袆?chuàng)建和使用對(duì)象的基本操作,它使得類的概念得以在程序中具體實(shí)現(xiàn)和操作。
#include<iostream>
using namespace std;
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
// 這?只是聲明,沒(méi)有開(kāi)空間
int _year;
int _month;
int _day;
};
int main(){
// Date類實(shí)例化出對(duì)象d1和d2
Date d1;
Date d2;
d1.Init(2024, 3, 31);
d1.Print();
d2.Init(2024, 7, 5);
d2.Print();
return 0;
}
二、對(duì)象大小
1.對(duì)象存儲(chǔ)
這段內(nèi)容討論了C+++中對(duì)象大小的概念,特別是對(duì)象如何存儲(chǔ)成員變量和成員函數(shù),以及內(nèi)存對(duì)齊規(guī)則對(duì)對(duì)象大小的影響。以下是對(duì)這段內(nèi)容的總結(jié):
對(duì)象存儲(chǔ)方式設(shè)計(jì)
-
成員變量存儲(chǔ):對(duì)象中存儲(chǔ)的是成員變量,這些變量是對(duì)象狀態(tài)的具體表示。每個(gè)對(duì)象都有自己的成員變量副本,用于存儲(chǔ)各自的數(shù)據(jù)。
-
成員函數(shù)存儲(chǔ):成員函數(shù)本身不存儲(chǔ)在對(duì)象中。成員函數(shù)在編譯后被轉(zhuǎn)換為機(jī)器指令,存儲(chǔ)在代碼段中。對(duì)象中存儲(chǔ)的是成員函數(shù)的地址(即函數(shù)指針),這些指針指向代碼段中的函數(shù)實(shí)現(xiàn)。
-
函數(shù)指針:函數(shù)指針在編譯時(shí)就已經(jīng)確定,不需要在每個(gè)對(duì)象中重復(fù)存儲(chǔ)。只有在動(dòng)態(tài)多態(tài)的情況下,函數(shù)地址才需要在運(yùn)行時(shí)確定,這時(shí)才需要存儲(chǔ)函數(shù)地址。
2.內(nèi)存對(duì)齊規(guī)則
內(nèi)存對(duì)齊規(guī)則
-
第一個(gè)成員變量:在結(jié)構(gòu)體或類中,第一個(gè)成員變量的偏移量為0。
-
其他成員變量:其他成員變量的地址需要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍。這個(gè)對(duì)齊數(shù)是編譯器默認(rèn)的對(duì)齊數(shù)與成員變量大小的較小值。
-
編譯器默認(rèn)對(duì)齊數(shù):在Visual Studio(VS)中,默認(rèn)的對(duì)齊數(shù)為8字節(jié)。
-
結(jié)構(gòu)體總大小:結(jié)構(gòu)體的總大小是所有成員變量最大對(duì)齊數(shù)的整數(shù)倍。如果結(jié)構(gòu)體中嵌套了其他結(jié)構(gòu)體,那么嵌套的結(jié)構(gòu)體也需要對(duì)齊到自己的最大對(duì)齊數(shù)。
#include<iostream>
using namespace std;
// 計(jì)算?下A/B/C實(shí)例化的對(duì)象是多??
class A
{
public:
void Print()
{
cout << _ch << endl;
}
private:
char _ch;
int _i;
};
class B
{
public:
void Print()
{
//...
}
};
class C
{};
int main()
{
A a;
B b;
C c;
cout << sizeof(a) << endl;cout << sizeof(b) << endl;
cout << sizeof(c) << endl;
return 0;
}
總結(jié)
- 對(duì)象實(shí)例化時(shí),只存儲(chǔ)成員變量,不存儲(chǔ)成員函數(shù)的代碼。
- 成員函數(shù)的地址(函數(shù)指針)在對(duì)象中存儲(chǔ),用于調(diào)用成員函數(shù)。
- 內(nèi)存對(duì)齊規(guī)則確保了成員變量的地址是其大小的整數(shù)倍,這有助于提高內(nèi)存訪問(wèn)的效率。
- 結(jié)構(gòu)體或類的大小由其成員變量的最大對(duì)齊數(shù)決定,以確保內(nèi)存布局的效率。
這段內(nèi)容強(qiáng)調(diào)了在設(shè)計(jì)類和結(jié)構(gòu)體時(shí),內(nèi)存對(duì)齊是一個(gè)重要的考慮因素,它影響著對(duì)象的存儲(chǔ)和性能。通過(guò)理解這些概念,開(kāi)發(fā)者可以更好地控制對(duì)象的內(nèi)存布局,優(yōu)化程序的性能。