帶有指標成員的資料class,為了防止多個指標指向同一塊記憶體位址造成資料混亂,需要進行以下基本的函式重寫
以string為例:
拷貝建構函式
乙個引數為本身資料型別的建構函式: 即 a(a a);
拷貝賦值函式
操作符 = 過載, 將同型別的資料進行賦值操作 a = b
析構函式 ~
將物件記憶體等進行**處理的函式,即將其成員資料銷毀
拷貝建構函式和拷貝賦值: 乙個是建構函式,乙個屬於操作符的過載,這兩個函式都是將資料進行賦值操作。
說明:為什麼帶有指標的class必須要重寫拷貝構造和拷貝賦值函式,並重寫析構函式。
1. 成員資料的拷貝:帶有指標的成員需要將指標指向的資料進行拷貝操作,而不是將指標本身進行拷貝複製。以保證賦值之後的資料操作和原始資料是兩個不同的物件。
2. 析構函式: 將帶有指標的成員執行的記憶體銷毀,避免記憶體洩漏。
3. 以上三個函式即使不進行顯示重寫,編譯器也會預設匹配乙個,編譯器預設匹配的函式將知識對表面的資料型別或者指標本身進行複製操作。這樣會導致複製之後的物件和原始物件將享有同一塊記憶體空間的資料,發生異常。
棧在函式體內宣告的任何變數,其所使用的記憶體塊都來自於棧
堆由操作係用提供的一塊全域性的記憶體空間,程式可以動態分配其所使用的記憶體空間。例如使用new 關鍵字建立的物件都屬於堆記憶體空間。
static 物件:
使用static 修飾的物件,在生命在作用域結束之後依然可以存在的物件,其宣告週期與程式宣告週期想用
global 物件
由global修飾的物件,其宣告週期與程式生命週期相同。
記憶體洩漏:
即指標死亡之後,其所指向的記憶體空間沒有被有效的銷毀,導致程式可能存在的異常情況。
new 操作符:
用於分配記憶體並建立物件。
1、首先,分配記憶體空間
2、其次,呼叫物件的建構函式,建立物件
3、其後, 物件的使用
4、再次,呼叫析構函式
5、最後,銷毀記憶體空間,釋放記憶體。
陣列new和陣列del一定是匹配的
string * p = new string[3];
delete p // 如果使用delete p 則只會銷毀p指向的第乙個記憶體,因為不提供 符號,delete 不知道是銷毀的p物件,還是p 物件。
#ifndef mystring_hpp
#define mystring_hpp
#include
class
mystring
private
:char
* m_data;};
#endif
/* mystring_hpp */
原始檔
#include
"mystring.hpp"
#include
//拷貝建構函式
inline mystring::
mystring
(const
char
* cstr)
else
}//拷貝建構函式
inline mystring::
mystring
(const mystring& str)
//拷貝賦值函式
inline mystring& mystring::
operator=(
const mystring& str)
//在拷貝之前,應該將原有的字串物件的資料進行清空,記憶體空間進行銷毀
delete
m_data;
//重新進行記憶體的分配及資料複製
m_data =
newchar
[strlen
(str.m_data)+1
];strcpy
(m_data,str.m_data)
;return
*this;}
//析構函式
inline mystring::
~mystring()
測試使用
#include
#include
"complex.hpp"
#include
"mystring.cpp"
intmain
(int argc,
const
char
* ar**)
c 中string擷取帶有中文字串的解決方案
include include using namespace std define max char lengh 20 intmain intercept str i intercept str i else 在判斷是不是中文的時候可以通過string i 0x80來作判斷如果為真,就證明是中文字...
帶有const修飾的指標解讀
通過例項來看看const所修飾的指標使用方法 1 先看乙個普通的指標使用。形式 int ptmp 含義 乙個普通的指向int型別的指標 cpp view plain copy print?intmain intargc,char argv 輸出 plain view plain copy print...
boolan c 帶有指標成員的class
帶有指標成員的class一般必須手寫三個特殊函式,被稱為big three 1 拷貝建構函式 接收自己這種型別作為引數的建構函式 2 拷貝賦值函式 符號的過載 3 析構函式 編譯器給出的預設拷貝建構函式和拷貝賦值函式時按照位元來複製。對於含有指標成員的class,這樣的複製是僅僅複製了指標,而指標所...