程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中對象的常援用、靜態樹立和釋放相干常識講授

C++中對象的常援用、靜態樹立和釋放相干常識講授

編輯:關於C++

C++中對象的常援用、靜態樹立和釋放相干常識講授。本站提示廣大學習愛好者:(C++中對象的常援用、靜態樹立和釋放相干常識講授)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中對象的常援用、靜態樹立和釋放相干常識講授正文


C++對象的常援用
我們曉得,一個變量的援用就是變量的別號。本質上,變量名和援用名都指向統一段內存單位。

假如形參為變量的援用名,實參為變量名,則在挪用函數停止真假聯合時,其實不是為形參別的開拓一個存儲空間(常稱為樹立實參的一個拷貝), 而是把實參變量的地址傳給形參(援用名),如許援用名也指向實參變量。

[例] 對象的常援用。

#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) //界說結構函數
{
  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;
}

假如不願望在函數中修正實參t1的值,可以把援用變量t聲明為const(常援用),函數原型為

  void fun(const Time &t);


則在函數中不克不及轉變t的值,也就是不克不及轉變其對應的實參t1的值。

在C++面向對象法式設計中,常常用常指針和常援用作函數參數。如許既能包管數據平安,使數據不克不及被隨便修正,在挪用函數時又不用樹立實參的拷貝。

每次挪用函數樹立實參的拷貝時,都要挪用復制結構函數,要有時光開支。用常指針和常援用作函數參數,可以進步法式運轉效力。


C++對象的靜態樹立和釋放
應用類名界說的對象都是靜態的,在法式運轉進程中,對象所占的空間是不克不及隨時釋放的。但有時人們願望在須要用到對象時才樹立對象,在不須要用該對象時就撤消它,釋放它所占的內存空間以供其余數據應用。如許可進步內存空間的應用率。

在C++中,可使用new運算符靜態地分派內存,用delete運算符釋放這些內存空間。這也實用於對象,可以用new運算符靜態樹立對象,用delete運算符撤消對象。

假如曾經界說了一個Box類,可以用上面的辦法靜態地樹立一個對象:

  new Box;


編譯體系開拓了一段內存空間,並在此內存空間中寄存一個Box類對象,同時挪用該類的結構函數,以使該對象初始化(假如已對結構函數付與此功效的話)。

然則此時用戶還沒法拜訪這個對象,由於這個對象既沒有對象名,用戶也不曉得它的地址。這類對象稱為無名對象,它確切是存在的,但它沒著名字。

用new運算符靜態地分派內存後,將前往一個指向新對象的指針的值,即所分派的內存空間的肇端地址。用戶可以取得這個地址,並經由過程這個地址來拜訪這個對象。須要界說一個指向本類的對象的指針變量來寄存該地址。如

  Box *pt; //界說一個指向Box類對象的指針變量pt
  pt=new Box; //在pt中寄存了新建對象的肇端地址


在法式中便可以經由過程pt拜訪這個新建的對象。如

  cout<<pt->height; //輸入該對象的height成員
  cout<<pt->volume( ); //挪用該對象的volume函數,盤算並輸入體積

C++還許可在履行new時,對新樹立的對象停止初始化。如

  Box *pt=new Box(12,15,18);


這類寫法是把下面兩個語句(界說指針變量和用new樹立新對象)歸並為一個語句,並指定初值。如許更精華精辟。

新對象中的height,width和length分離取得初值12,15,18。挪用對象既可以經由過程對象名,也能夠經由過程指針。

用new樹立的靜態對象普通是不消對象名的,是經由過程指針拜訪的,它重要運用於靜態的數據構造,如鏈表。拜訪鏈表中的結點,其實不須要經由過程對象名,而是在上一個結點中寄存下一個結點的地址,從而由上一個結點找到下一個結點,組成鏈接的關系。

在履行new運算時,假如內存量缺乏,沒法開拓所需的內存空間,今朝年夜多半C++編譯體系都使new前往一個0指針值。只需檢測前往值能否為0,便可斷定分派內存能否勝利。

ANSI C++尺度提出,在履行new湧現毛病時,就“拋出”一個“異常”,用戶可依據異常停止有關處置。但C++尺度依然許可在湧現new毛病時前往0指針值。以後,分歧的編譯體系對new毛病的處置辦法是分歧的。

在不再須要應用由new樹立的對象時,可以用delete運算符予以釋放。如

  delete pt; //釋放pt指向的內存空間


這就撤消了pt指向的對象。爾後法式不克不及再應用該對象。

假如用一個指針變量pt前後指向分歧的靜態對象,應留意指針變量確當前指向,以避免刪錯了對象。在履行delete運算符時,在釋放內存空間之前,主動挪用析構函數,完成有關善後清算任務。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved