C 類的物件和類的指標的區別 指標和引用的區別

2021-07-04 08:19:38 字數 3097 閱讀 3017

#include #include using namespace std;

class student

void set(string str)

void print() // 態成員函式 print()

};int student::number = 0; // 靜態資料成員初始化

int main(int argc, char** argv)

對於類student ,定義了乙個物件和乙個指標。

1、1)類的指標:他是乙個記憶體位址值,他指向記憶體中存放的類物件(包括一些成員變數所賦的值) 

2)物件,他是利用類的建構函式在記憶體中分配一塊記憶體(包括一些成員變數所賦的值). 

2、在應用時: 

1)引用成員: 

物件用" 

.  "操作符; 

指標用" 

-> 

"操作符. 

2)生命期: 

若是成員變數,則是類的析構函式來釋放空間;

若是函式中的臨時變數,則作用域是該函式體內.

而指標,則需利用delete 在相應的地方釋放分配的記憶體塊. 

注意:用new ,一定要delete

3)指標可以實現多型,直接用物件不行

4)在類的宣告尚未完成的情況下,可以宣告指向該類的指標,但是不可宣告該類的物件.

5)父類的指標可以指向子類的物件

6)定義物件例項時,分配了記憶體。指標變數則未分配類物件所需記憶體,除非new了

指標變數是間接訪問,但可實現多型(通過父類指標可呼叫子類物件),並且沒有呼叫建構函式。

直接宣告可直接訪問,但不能實現多型,宣告即呼叫了建構函式(已分配了記憶體)。

3、類的物件:用的是記憶體棧,是個區域性的臨時變數. 

類的指標:用的是記憶體堆,是個永久變數,除非你釋放它. 

4、當類是有虛函式的基類,func是它的乙個虛函式,則呼叫func時: 

1)類的物件:呼叫的是它自己的func; 

2)類的指標:呼叫的是分配給它空間時那種類的func;

5、型別決定了你能做什麼.

其實作用基本一樣都是為了呼叫類的成員變數和成員函式用的

當你希望明確使用這個類的時候,最好使用物件,如果你希望使用c++中的動態繫結,則最好使用指標或者引用,指標和引用用起來更靈活,容易實現多型等

c++的精髓之一就是多型性,只有指標或者引用可以達到多型。物件不行

用指標:

第一,實現多型。

第二,在函式呼叫,傳指標引數。不管你的物件或結構引數多麼龐大,你用指標,傳過去的就是4個位元組。如果用物件,引數傳遞占用的資源就太大了

二、指標和引用的區別

1.指標和引用的定義和性質區別:

(1)指標:指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。

而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(3)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)"sizeof引用"得到的是所指向的變數(物件)的大小,而"sizeof指標"得到的是指標本身的大小;

(7)指標和引用的自增(++)運算意義不一樣;

2.指標和引用作為函式引數進行傳遞時的區別。

(1)指標作為引數進行傳遞:

#includeusing namespace std;

void swap(int *a,int *b)

int main(void)

{  int a=1,b=2;

swap(&a,&b);

cout《結果為2 1;

用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的位址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。

再看乙個程式;

#includeusing namespace std;

void test(int *p)

{  int a=1;

p=&a;

cout<

執行結果為:

0x22ff44 1

指標p為null

事實上,在main函式中宣告了乙個指標p,並賦值為null,當呼叫test函式時,事實上傳遞的也是位址,只不過傳遞的是值位址。也就是說將指標作為引數進行傳遞時,事實上也是值傳遞,只不過傳遞的是位址。

當把指標作為引數進行傳遞時,也是將實參的乙個拷貝傳遞給形參,即上面程式main函式中的p 和 test函式中使用的p不是同乙個變數,只是2個p指向同乙個儲存單元,那麼在test函式中對p進行修改,並不會影響到main函式中的p的值。

如果要想達到也同時修改的目的的話,就得使用引用了。

2.將引用作為函式的引數進行傳遞。

在講引用作為函式引數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的乙個拷貝,因此對形參的修改其實是對實參的修改,所以在用引用進行引數傳遞時,不僅節約時間,而且可以節約空間。

看下面這個程式:

// testtest.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include #include using namespace std;

int ab=0;

void test(int &a)

{ a++;

cout<<&a<<" "<

輸出結果為: 0x22ff44 1

0x22ff44 2

0x22ff44 2

再看下這個程式:

這足以說明用引用進行引數傳遞時,事實上傳遞的是實參本身,而不是拷貝。

所以在上述要達到同時修改指標的目的的話,就得使用引用了。 

類物件和類指標的區別

對於類ctest 宣告 類物件ctest c1 利用類的建構函式在記憶體中分配一塊記憶體,呼叫了建構函式 類指標ctest pc1 是乙個記憶體位址值,指向記憶體中存放的類物件,沒有呼叫建構函式 引用成員 物件用 指標用 物件生命期 若是成員變數,則是類的析構函式來釋放空間 若是函式中的臨時變數,則...

類指標和類物件的區別

如下程式 include include using namespace std class student void set string str void print 態成員函式 print int student number 0 靜態資料成員初始化 int main int argc,cha...

類物件和類指標的區別

如下程式 include include using namespace std class student voidset string str void print 態成員函式 print int student number 0 靜態資料成員初始化 int main int argc,char...