C++中對(duì)象的常引用、動(dòng)態(tài)建立和釋放相關(guān)知識(shí)講解
C++對(duì)象的常引用
我們知道,一個(gè)變量的引用就是變量的別名。實(shí)質(zhì)上,變量名和引用名都指向同一段內(nèi)存單元。
如果形參為變量的引用名,實(shí)參為變量名,則在調(diào)用函數(shù)進(jìn)行虛實(shí)結(jié)合時(shí),并不是為形參另外開(kāi)辟一個(gè)存儲(chǔ)空間(常稱(chēng)為建立實(shí)參的一個(gè)拷貝), 而是把實(shí)參變量的地址傳給形參(引用名),這樣引用名也指向?qū)崊⒆兞俊?/p>
[例] 對(duì)象的常引用。
#include <iostream>
using namespace std;
class Time
{
  public:
  Time(int,int,int);
  int hour;
  int minute;
  int sec;
};
Time::Time(int h,int m,int s) //定義構(gòu)造函數(shù)
{
  hour=h;
  minute=m;
  sec=s;
}
void fun(Time &t)
{
  t.hour=18;
}
int main( )
{
  Time t1(10,13,56);
  fun(t1);
  cout<<t1.hour<<endl;
  return 0;
}
如果不希望在函數(shù)中修改實(shí)參t1的值,可以把引用變量t聲明為const(常引用),函數(shù)原型為
void fun(const Time &t);
則在函數(shù)中不能改變t的值,也就是不能改變其對(duì)應(yīng)的實(shí)參t1的值。
在C++面向?qū)ο蟪绦蛟O(shè)計(jì)中,經(jīng)常用常指針和常引用作函數(shù)參數(shù)。這樣既能保證數(shù)據(jù)安全,使數(shù)據(jù)不能被隨意修改,在調(diào)用函數(shù)時(shí)又不必建立實(shí)參的拷貝。
每次調(diào)用函數(shù)建立實(shí)參的拷貝時(shí),都要調(diào)用復(fù)制構(gòu)造函數(shù),要有時(shí)間開(kāi)銷(xiāo)。用常指針和常引用作函數(shù)參數(shù),可以提高程序運(yùn)行效率。
C++對(duì)象的動(dòng)態(tài)建立和釋放
使用類(lèi)名定義的對(duì)象都是靜態(tài)的,在程序運(yùn)行過(guò)程中,對(duì)象所占的空間是不能隨時(shí)釋放的。但有時(shí)人們希望在需要用到對(duì)象時(shí)才建立對(duì)象,在不需要用該對(duì)象時(shí)就撤銷(xiāo)它,釋放它所占的內(nèi)存空間以供別的數(shù)據(jù)使用。這樣可提高內(nèi)存空間的利用率。
在C++中,可以使用new運(yùn)算符動(dòng)態(tài)地分配內(nèi)存,用delete運(yùn)算符釋放這些內(nèi)存空間。這也適用于對(duì)象,可以用new運(yùn)算符動(dòng)態(tài)建立對(duì)象,用delete運(yùn)算符撤銷(xiāo)對(duì)象。
如果已經(jīng)定義了一個(gè)Box類(lèi),可以用下面的方法動(dòng)態(tài)地建立一個(gè)對(duì)象:
new Box;
編譯系統(tǒng)開(kāi)辟了一段內(nèi)存空間,并在此內(nèi)存空間中存放一個(gè)Box類(lèi)對(duì)象,同時(shí)調(diào)用該類(lèi)的構(gòu)造函數(shù),以使該對(duì)象初始化(如果已對(duì)構(gòu)造函數(shù)賦予此功能的話)。
但是此時(shí)用戶(hù)還無(wú)法訪問(wèn)這個(gè)對(duì)象,因?yàn)檫@個(gè)對(duì)象既沒(méi)有對(duì)象名,用戶(hù)也不知道它的地址。這種對(duì)象稱(chēng)為無(wú)名對(duì)象,它確實(shí)是存在的,但它沒(méi)有名字。
用new運(yùn)算符動(dòng)態(tài)地分配內(nèi)存后,將返回一個(gè)指向新對(duì)象的指針的值,即所分配的內(nèi)存空間的起始地址。用戶(hù)可以獲得這個(gè)地址,并通過(guò)這個(gè)地址來(lái)訪問(wèn)這個(gè)對(duì)象。需要定義一個(gè)指向本類(lèi)的對(duì)象的指針變量來(lái)存放該地址。如
Box *pt; //定義一個(gè)指向Box類(lèi)對(duì)象的指針變量pt pt=new Box; //在pt中存放了新建對(duì)象的起始地址
在程序中就可以通過(guò)pt訪問(wèn)這個(gè)新建的對(duì)象。如
cout<<pt->height; //輸出該對(duì)象的height成員 cout<<pt->volume( ); //調(diào)用該對(duì)象的volume函數(shù),計(jì)算并輸出體積
C++還允許在執(zhí)行new時(shí),對(duì)新建立的對(duì)象進(jìn)行初始化。如
Box *pt=new Box(12,15,18);
這種寫(xiě)法是把上面兩個(gè)語(yǔ)句(定義指針變量和用new建立新對(duì)象)合并為一個(gè)語(yǔ)句,并指定初值。這樣更精煉。
新對(duì)象中的height,width和length分別獲得初值12,15,18。調(diào)用對(duì)象既可以通過(guò)對(duì)象名,也可以通過(guò)指針。
用new建立的動(dòng)態(tài)對(duì)象一般是不用對(duì)象名的,是通過(guò)指針訪問(wèn)的,它主要應(yīng)用于動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu),如鏈表。訪問(wèn)鏈表中的結(jié)點(diǎn),并不需要通過(guò)對(duì)象名,而是在上一個(gè)結(jié)點(diǎn)中存放下一個(gè)結(jié)點(diǎn)的地址,從而由上一個(gè)結(jié)點(diǎn)找到下一個(gè)結(jié)點(diǎn),構(gòu)成鏈接的關(guān)系。
在執(zhí)行new運(yùn)算時(shí),如果內(nèi)存量不足,無(wú)法開(kāi)辟所需的內(nèi)存空間,目前大多數(shù)C++編譯系統(tǒng)都使new返回一個(gè)0指針值。只要檢測(cè)返回值是否為0,就可判斷分配內(nèi)存是否成功。
ANSI C++標(biāo)準(zhǔn)提出,在執(zhí)行new出現(xiàn)故障時(shí),就“拋出”一個(gè)“異常”,用戶(hù)可根據(jù)異常進(jìn)行有關(guān)處理。但C++標(biāo)準(zhǔn)仍然允許在出現(xiàn)new故障時(shí)返回0指針值。當(dāng)前,不同的編譯系統(tǒng)對(duì)new故障的處理方法是不同的。
在不再需要使用由new建立的對(duì)象時(shí),可以用delete運(yùn)算符予以釋放。如
delete pt; //釋放pt指向的內(nèi)存空間
這就撤銷(xiāo)了pt指向的對(duì)象。此后程序不能再使用該對(duì)象。
如果用一個(gè)指針變量pt先后指向不同的動(dòng)態(tài)對(duì)象,應(yīng)注意指針變量的當(dāng)前指向,以免刪錯(cuò)了對(duì)象。在執(zhí)行delete運(yùn)算符時(shí),在釋放內(nèi)存空間之前,自動(dòng)調(diào)用析構(gòu)函數(shù),完成有關(guān)善后清理工作。
上一篇:C++動(dòng)態(tài)分配和撤銷(xiāo)內(nèi)存以及結(jié)構(gòu)體類(lèi)型作為函數(shù)參數(shù)
欄 目:C語(yǔ)言
下一篇:C++編程中將引用類(lèi)型作為函數(shù)參數(shù)的方法指南
本文標(biāo)題:C++中對(duì)象的常引用、動(dòng)態(tài)建立和釋放相關(guān)知識(shí)講解
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2722.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
 - 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
 - 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
 - 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
 - 01-10APUE筆記之:進(jìn)程環(huán)境詳解
 - 01-10c++中inline的用法分析
 - 01-10如何尋找數(shù)組中的第二大數(shù)
 


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
 - 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
 - 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
 - 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
 - 5c語(yǔ)言計(jì)算三角形面積代碼
 - 6什么是 WSH(腳本宿主)的詳細(xì)解釋
 - 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
 - 8正則表達(dá)式匹配各種特殊字符
 - 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
 - 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
 
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
 - 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
 - 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
 - 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
 - 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
 - 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
 - 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
 - 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
 - 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
 - 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
 
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
 - 01-10delphi制作wav文件的方法
 - 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
 - 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
 - 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
 - 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
 - 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
 - 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
 - 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
 - 04-02jquery與jsp,用jquery
 


