C++類和對象之相關特性解讀
一.類型轉換
在C++中,類類型轉換是指將一個類的對象轉換為另一個類的對象,或者將一個類的對象轉換為基本數(shù)據(jù)類型等。
C++提供了多種類型的轉換機制,包括隱式類型轉換和顯式類型轉換。
以下是關于C++類類型轉換的詳細介紹:
隱式類型轉換
?構造函數(shù)實現(xiàn)的隱式轉換
如果一個類的構造函數(shù)只有一個參數(shù)(除了可能的默認參數(shù)外),那么這個構造函數(shù)可以被用作隱式類型轉換。例如:
class B {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> public: B(int x) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> /* ... */ } };
這時,可以將int類型的值隱式轉換為B類型的對象:
B b = 5; // 通過B的構造函數(shù)將5隱式轉換為B對象
在類類型有多個參數(shù)時,可以使用{ xxx ,xxx },的形式來進行轉換,不能使用(),因為()會計算出括號內最后一個表達式的值
類型轉換運算符實現(xiàn)的隱式轉換
類可以定義類型轉換運算符,將類的對象隱式轉換為其他類型。例如:
class A {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> public: operator int() const {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> return 10; } };
這時,A類型的對象可以隱式轉換為int類型:
A a; int x = a; // 通過A的類型轉換運算符將a隱式轉換為int
這種隱式轉換可能會導致一些意外的錯誤,因此可以通過在構造函數(shù)前加上explicit關鍵字來禁止這種隱式轉換:
class B {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> public: explicit B(int x) {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> /* ... */ } };
這樣,B b = 5;就會報錯,而必須顯式地調用構造函數(shù):B b(5);。
類類型的對象之間也可以隱式轉換,需要相應的構造函數(shù)?持
二.static成員
在C++中,static
成員是類的一個重要特性,它與類本身相關聯(lián),而不是與類的某個具體對象相關聯(lián)。這意味著static
成員在類的所有對象之間是共享的。以下是對static
成員的詳細介紹:
static成員變量
定義與初始化
static成員變量是類的所有對象共享的變量。它在類的定義中聲明,但需要在類的定義外進行初始化。 ?static修飾的成員變量,稱之為靜態(tài)成員變量,靜態(tài)成員變量?定要在類外進?初始化。例如:
class MyClass {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> public: static int count; // 聲明static成員變量 }; int MyClass::count = 0; // 初始化static成員變量
注意,static成員變量的初始化必須在類的定義外進行,且只能初始化一次。
訪問方式
static成員變量可以通過類名或類的對象來訪問,但推薦使用類名訪問,以體現(xiàn)其與類的關系。例如:
MyClass::count = 10; // 通過類名訪問 MyClass obj; obj.count = 20; // 通過對象訪問(不推薦,但合法)
無論通過類名還是對象訪問,static成員變量都是同一個變量。
生命周期
static成員變量的生命周期從程序開始運行時初始化,到程序結束時銷毀。它不依賴于類的對象的生命周期。
靜態(tài)成員變量不能在聲明位置給缺省值初始化,因為缺省值是個構造函數(shù)初始化列表的,靜態(tài)成員變量不屬于某個對象,不?構造函數(shù)初始化列表.
static成員函數(shù)
定義與調用
static
成員函數(shù)是與類相關聯(lián)的函數(shù),而不是與類的某個具體對象相關聯(lián)。它不能訪問非static
成員變量和非static
成員函數(shù),因為這些成員需要對象的上下文。例如:
class MyClass {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> public: static void print() {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> std::cout << "Static function" << std::endl; } }; 點擊并拖拽以移動
static
成員函數(shù)可以通過類名或類的對象來調用,但推薦使用類名調用。例如:
MyClass::print(); // 通過類名調用 MyClass obj; obj.print(); // 通過對象調用(不推薦,但合法)
特點?
static
成員函數(shù)沒有this
指針,因為它不依賴于具體的對象。- 它可以訪問類的
static
成員變量和其他static
成員函數(shù)。 - 靜態(tài)成員也是類的成員,受public、protected、private訪問限定符的限制。
應用場景
- 常用于實現(xiàn)與類相關的工具函數(shù),這些函數(shù)不需要訪問類的對象的成員變量。
- 例如,實現(xiàn)一個全局的計數(shù)器:
class MyClass { public: static void incrementCount() { count++; } static int getCount() { return count; } private: static int count; }; int MyClass::count = 0; int main() { MyClass::incrementCount(); std::cout << MyClass::getCount() << std::endl; // 輸出1 return 0; }
static成員的存儲位置
static
成員變量和static
成員函數(shù)的存儲位置通常在程序的全局數(shù)據(jù)區(qū)。它們在程序啟動時分配內存,在程序結束時釋放內存。- 與全局變量類似,
static
成員變量在全局數(shù)據(jù)區(qū)中有一個固定的地址,所有對象共享這個地址。 - 靜態(tài)成員變量為所有類對象所共享,不屬于某個具體的對象,不存在對象中,存放在靜態(tài)區(qū)。
心得:
static
成員變量和static
成員函數(shù)是類的靜態(tài)特性,它們與類本身相關聯(lián),而不是與類的對象相關聯(lián)。static
成員變量需要在類的定義外初始化,并且可以通過類名或對象訪問。- static修飾的成員函數(shù),稱之為靜態(tài)成員函數(shù)
static
成員函數(shù)沒有this
指針,只能訪問類的static
成員變量和其他static
成員函數(shù)。 - 靜態(tài)的成員函數(shù),可以訪問任意的靜態(tài)成員變量和靜態(tài)成員函數(shù)。
- 靜態(tài)成員函數(shù)中可以訪問其他的靜態(tài)成員,但是不能訪問?靜態(tài)的,因為沒有this指針。
- 突破類域就可以訪問靜態(tài)成員,可以通過類名::靜態(tài)成員或者對象.靜態(tài)成員 來訪問靜態(tài)成員變量和靜態(tài)成員函數(shù)。
三.友元
在C++中,友元(Friend) 是一個非常重要的概念,它允許某些特定的函數(shù)或類訪問另一個類的私有(private
)和保護(protected
)成員。
這在某些情況下非常有用,尤其是當你需要在類的封裝性與功能需求之間找到平衡時。
友元函數(shù)
定義
- 友元函數(shù)不是類的成員函數(shù),但它可以訪問類的私有和保護成員。
- 友元函數(shù)需要在類的定義中使用
friend
關鍵字聲明。
特點
- 友元函數(shù)不是類的成員函數(shù),因此它沒有
this
指針。 - 友元函數(shù)的定義可以位于類的定義內或定義外,但聲明必須在類的定義中。
- 友元函數(shù)可以訪問類的所有成員(包括私有和保護成員)。
- ?個函數(shù)可以是多個類的友元函數(shù)。
友元類
定義
- 友元類是一個類,它的所有成員函數(shù)都可以訪問另一個類的私有和保護成員。
- 友元類需要在類的定義中使用
friend
關鍵字聲明。例如:
class MyClass { private: int privateData; public: MyClass(int data) : privateData(data) {} friend class FriendClass; // 聲明友元類 }; class FriendClass { public: void printPrivateData(const MyClass& obj) { std::cout << "Private Data: " << obj.privateData << std::endl; } };
在這個例子中,FriendClass
是MyClass
的友元類,因此FriendClass
的所有成員函數(shù)都可以訪問MyClass
的私有成員privateData
。
特點
- 友元類的所有成員函數(shù)都可以訪問被友元類聲明的類的私有和保護成員。
- 友元類的聲明方式與友元函數(shù)類似,但聲明的是整個類。
友元成員函數(shù)
定義
- 友元成員函數(shù)是另一個類的成員函數(shù),但它可以訪問當前類的私有和保護成員。友元成員函數(shù)需要在類的定義中使用
friend
關鍵字聲明,并指定所屬類和函數(shù)名。
特點
- 友元成員函數(shù)是另一個類的成員函數(shù),但它可以訪問當前類的私有和保護成員。
- 友元成員函數(shù)的聲明需要指定所屬類和函數(shù)名。
- 元類中的成員函數(shù)都可以是另?個類的友元函數(shù),都可以訪問另?個類中的私有和保護成員。
- 友元類的關系是單向的,不具有交換性,?如A類是B類的友元,但是B類不是A類的友元。
- 友元類關系不能傳遞,如果A是B的友元,B是C的友元,但是A不是C的友元。
小結:
- 友元函數(shù):允許特定的非成員函數(shù)訪問類的私有和保護成員。
- 友元類:允許另一個類的所有成員函數(shù)訪問當前類的私有和保護成員。
- 友元成員函數(shù):允許另一個類的特定成員函數(shù)訪問當前類的私有和保護成員。
- 使用注意事項:謹慎使用友元,盡量減少對類的內部結構的暴露,避免破壞封裝性。友元破壞了類的封裝性,因為它允許外部函數(shù)或類訪問類的私有和保護成員。因此,應該謹慎使用友元,只在必要時才使用。
四.內部類
如果?個類定義在另?個類的內部,這個內部類就叫做內部類。內部類是?個獨?的類,跟定義在全局相?,他只是受外部類類域限制和訪問限定符限制,所以外部類定義的對象中不包含內部類。
內部類默認是外部類的友元類。
內部類本質也是?種封裝,當A類跟B類緊密關聯(lián),A類實現(xiàn)出來主要就是給B類使?,那么可以考慮把A類設計為B的內部類,如果放到private/protected位置,那么A類就是B類的專屬內部類,其他地?都?不了。
內部類和外部類為平行關系,計算大小時不算內部類,內部類不算外部類的一部分,收訪問限定符的限制
五.匿名對象
通常情況下,我們定義的是有名對象。
在C++中,匿名對象是指沒有顯式命名的對象。它們通常在需要臨時使用某個類的對象時被創(chuàng)建,使用完畢后立即銷毀。
匿名對象?命周期只在當前??,?般臨時定義?個對象當前??下即可。
六.new
當使用動態(tài)內存分配(new)創(chuàng)建數(shù)組時,構造函數(shù)的調用機制與靜態(tài)數(shù)組是相同的,但有一些額外的注意事項。
動態(tài)數(shù)組的構造函數(shù)調用 Sum* arr = new Sum[n]; // 動態(tài)創(chuàng)建長度為n的Sum數(shù)組
這行代碼會:
- 在堆上分配足夠存儲n個Sum對象的內存
- 逐個調用每個元素的默認構造函數(shù)
- 返回指向第一個元素的指針
- 與靜態(tài)數(shù)組一樣,構造函數(shù)會被調用n次
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝
這篇文章主要介紹了詳解C++中String類模擬實現(xiàn)以及深拷貝淺拷貝的相關資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的方法,需要的朋友可以參考下2017-10-10C++高精度計時的幾種方法總結(測試函數(shù)運行時間)
本文介紹了C++中常用的幾種程序計時方法,包括clock()函數(shù)、GetTickCount()、QueryPerformanceCounter()以及C++11中的chrono庫函數(shù),這篇文章主要介紹了C++高精度計時的幾種方法,需要的朋友可以參考下2024-09-09