亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解C++中的對(duì)象指針與對(duì)象數(shù)組

 更新時(shí)間:2015年09月16日 18:44:33   投稿:goldensun  
這篇文章主要介紹了詳解C++中的對(duì)象指針與對(duì)象數(shù)組,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

C++對(duì)象指針
指向?qū)ο蟮闹羔?/p>

在建立對(duì)象時(shí),編譯系統(tǒng)會(huì)為每一個(gè)對(duì)象分配一定的存儲(chǔ)空間,以存放其成員。對(duì)象空間的起始地址就是對(duì)象的指針??梢远x一個(gè)指針變量,用來(lái)存放對(duì)象的指針。

如果有一個(gè)類(lèi):

class Time
{
  public :
  int hour;
  int minute;
  int sec;
  void get_time( );
};
void Time::get_time( )
{
  cout<<hour<<":"<<minute<<":"<<sec<<endl;
}

在此基礎(chǔ)上有以下語(yǔ)句:

  Time *pt; //定義pt為指向Time類(lèi)對(duì)象的指針變量
  Time t1; //定義t1為T(mén)ime類(lèi)對(duì)象
  pt=&t1; //將t1的起始地址賦給pt


這樣,pt就是指向Time類(lèi)對(duì)象的指針變量,它指向?qū)ο髏1。

定義指向類(lèi)對(duì)象的指針變量的一般形式為:

  類(lèi)名 *對(duì)象指針名;

可以通過(guò)對(duì)象指針訪問(wèn)對(duì)象和對(duì)象的成員。如:

  *pt  //pt所指向的對(duì)象,即t1
  (*pt).hour //pt所指向的對(duì)象中的hour成員,即t1.hour
  pt->hour //pt所指向的對(duì)象中的hour成員,即t1.hour
  (*pt).get_time ( )  //調(diào)用pt所指向的對(duì)象中的get_time函數(shù),即t1.get_time
  pt->get_time ( ) //調(diào)用pt所指向的對(duì)象中的get_time函數(shù),即t1.get_time

上面第2, 3行的作用是等價(jià)的,第4, 5兩行也是等價(jià)的。
指向?qū)ο蟪蓡T的指針

對(duì)象有地址,存放對(duì)象初始地址的指針變量就是指向?qū)ο蟮闹羔樧兞俊?duì)象中的成員也有地址,存放對(duì)象成員地址的指針變量就是指向?qū)ο蟪蓡T的指針變量。

1) 指向?qū)ο髷?shù)據(jù)成員的指針
定義指向?qū)ο髷?shù)據(jù)成員的指針變量的方法和定義指向普通變量的指針變量方法相同。例如:

  int *p1; //定義指向整型數(shù)據(jù)的指針變量


定義指向?qū)ο髷?shù)據(jù)成員的指針變量的一般形式為:

  數(shù)據(jù)類(lèi)型名 *指針變量名;


如果Time類(lèi)的數(shù)據(jù)成員hour為公用的整型數(shù)據(jù),則可以在類(lèi)外通過(guò)指向?qū)ο髷?shù)據(jù)成員的指針變量訪問(wèn)對(duì)象數(shù)據(jù)成員hour:

  p1=&t1.hour; //將對(duì)象t1的數(shù)據(jù)成員hour的地址賦給p1,p1指向t1.hour
  cout<<*p1<<endl; //輸出t1.hour的值

2) 指向?qū)ο蟪蓡T函數(shù)的指針
需要提醒讀者注意: 定義指向?qū)ο蟪蓡T函數(shù)的指針變量的方法和定義指向普通函數(shù)的指針變量方法有所不同。這里重溫一個(gè)指向普通函數(shù)的指針變量的定義方法:
    數(shù)據(jù)類(lèi)型名 (*指針變量名) (參數(shù)表列);

    void ( *p)( );  //p是指向void型函數(shù)的指針變量
可以使它指向一個(gè)函數(shù),并通過(guò)指針變量調(diào)用函數(shù):
    p = fun;  //將fun函數(shù)的人口地址傳給指針變童p,p就指向了函數(shù)fn
    (*P)( );  //調(diào)用fn函數(shù)

而定義一個(gè)指向?qū)ο蟪蓡T函數(shù)的指針變量則比較復(fù)雜一些。如果模仿上面的方法將對(duì)象成員函數(shù)名賦給指針變最P:

  p = t1.get_time;


則會(huì)出現(xiàn)編譯錯(cuò)誤。為什么呢?

成員函數(shù)與普通函數(shù)有一個(gè)最根本的區(qū)別: 它是類(lèi)中的一個(gè)成員。編譯系統(tǒng)要求在上面的賦值語(yǔ)句中,指針變量的類(lèi)型必須與賦值號(hào)右側(cè)函數(shù)的類(lèi)型相匹配,要求在以下3方面都要匹配:
①函數(shù)參數(shù)的類(lèi)型和參數(shù)個(gè)數(shù);
②函數(shù)返回值的類(lèi)型;
③所屬的類(lèi)。

現(xiàn)在3點(diǎn)中第①②兩點(diǎn)是匹配的,而第③點(diǎn)不匹配。指針變量p與類(lèi)無(wú)關(guān),面get_ time函數(shù)卻屬于Time類(lèi)。因此,要區(qū)別普通函數(shù)和成員函數(shù)的不同性質(zhì),不能在類(lèi)外直接用成員函數(shù)名作為函數(shù)入口地址去調(diào)用成員函數(shù)。

那么,應(yīng)該怎樣定義指向成員函數(shù)的指針變量呢?應(yīng)該采用下面的形式:

  void (Time::*p2)( ); //定義p2為指向Time類(lèi)中公用成員函數(shù)的指針變量


注意:(Time:: *p2) 兩側(cè)的括號(hào)不能省略,因?yàn)?)的優(yōu)先級(jí)高于*。如果無(wú)此括號(hào),就相當(dāng)于:

  void Time::*(p2()) //這是返回值為void型指針的函數(shù)

定義指向公用成員函數(shù)的指針變量的一般形式為:

  數(shù)據(jù)類(lèi)型名 (類(lèi)名::*指針變量名)(參數(shù)表列);

可以讓它指向一個(gè)公用成員函數(shù),只需把公用成員函數(shù)的入口地址賦給一個(gè)指向公用成員函數(shù)的指針變量即可。如:

  p2=&Time::get_time;


使指針變量指向一個(gè)公用成員函數(shù)的一般形式為

  指針變量名=&類(lèi)名::成員函數(shù)名;


在VC++系統(tǒng)中,也可以不寫(xiě)&,以和C語(yǔ)言的用法一致,但建議在寫(xiě)C++程序時(shí)不要省略&。

[例]有關(guān)對(duì)象指針的使用方法。

#include <iostream>
using namespace std;
class Time
{
  public:
  Time(int,int,int);
  int hour;
  int minute;
  int sec;
  void get_time( );
};
Time::Time(int h,int m,int s)
{
  hour=h;
  minute=m;
  sec=s;
}
void Time::get_time( ) //聲明公有成員函數(shù)
//定義公有成員函數(shù)
{
  cout<<hour<<":"<<minute<<":" <<sec<<endl;
}
int main( )
{
  Time t1(10,13,56); //定義Time類(lèi)對(duì)象t1
  int *p1=&t1.hour; //定義指向整型數(shù)據(jù)的指針變量p1,并使p1指向t1.hour
  cout<<* p1<<endl; //輸出p1所指的數(shù)據(jù)成員t1.hour
  t1.get_time( ); //調(diào)用對(duì)象t1的成員函數(shù)get_time
  Time *p2=&t1; //定義指向Time類(lèi)對(duì)象的指針變量p2,并使p2指向t1
  p2->get_time( ); //調(diào)用p2所指向?qū)ο?即t1)的get_time函數(shù)
  void (Time::*p3)( ); //定義指向Time類(lèi)公用成員函數(shù)的指針變量p3
  p3=&Time::get_time; //使p3指向Time類(lèi)公用成員函數(shù)get_time
  (t1.*p3)( ); //調(diào)用對(duì)象t1中p3所指的成員函數(shù)(即t1.get_time( ))
  return 0;
}

程序運(yùn)行結(jié)果為:

10 (main函數(shù)第4行的輸出)
10:13:56 (main函數(shù)第5行的輸出)
10:13:56 (main函數(shù)第7行的輸出)
10:13:56 (main函數(shù)第10行的輸出)


可以看到為了輸出t1中hour,minute和sec的值,可以采用3種不同的方法。

幾點(diǎn)說(shuō)明:
1) 從main函數(shù)第9行可以看出,成員函數(shù)的入口地址的正確寫(xiě)法是:

  &類(lèi)名::成員函數(shù)名


不應(yīng)該寫(xiě)成:

  p3 =&t1.get_time; //t1為對(duì)象名

成員函數(shù)不是存放在對(duì)象的空間中的,而是存放在對(duì)象外的空間中的。如果有多個(gè)同類(lèi)的對(duì)象,它們共用同一個(gè)函數(shù)代碼段。因此賦給指針變量p3的應(yīng)是這個(gè)公用的函數(shù)代碼段的入口地址。

調(diào)用t1的get_time函數(shù)可以用t1.get_time()形式,那是從邏輯的角度而言的,通過(guò)對(duì)象名能調(diào)用成員函數(shù)。而現(xiàn)在程序語(yǔ)句中需要的是地址,它是物理的,具體地址是和類(lèi)而不是對(duì)象相聯(lián)系的。

2) main函數(shù)第8, 9兩行可以合寫(xiě)為一行:

  void (Time::*p3)( )=&Time::get_time; //定義指針變量時(shí)指定其指向

C++對(duì)象數(shù)組
數(shù)組不僅可以由簡(jiǎn)單變量組成(例如整型數(shù)組的每一個(gè)元素都是整型變量),也可以由對(duì)象組成(對(duì)象數(shù)組的每一個(gè)元素都是同類(lèi)的對(duì)象)。

在日常生活中,有許多實(shí)體的屬性是共同的,只是屬性的具體內(nèi)容不同。例如一個(gè)班有50個(gè)學(xué)生,每個(gè)學(xué)生的屬性包括姓名、性別、年齡、成績(jī)等。如果為每一個(gè)學(xué)生建立一個(gè)對(duì)象,需要分別取50個(gè)對(duì)象名。用程序處理很不方便。這時(shí)可以定義一個(gè)“學(xué)生類(lèi)”對(duì)象數(shù)組,每一個(gè)數(shù)組元素是一個(gè)“學(xué)生類(lèi)”對(duì)象。例如

  Student stud[50]; //假設(shè)已聲明了Student類(lèi),定義stud數(shù)組,有50個(gè)元素


在建立數(shù)組時(shí),同樣要調(diào)用構(gòu)造函數(shù)。如果有50個(gè)元素,需要調(diào)用50次構(gòu)造函數(shù)。

在需要時(shí)可以在定義數(shù)組時(shí)提供實(shí)參以實(shí)現(xiàn)初始化。如果構(gòu)造函數(shù)只有一個(gè)參數(shù),在定義數(shù)組時(shí)可以直接在等號(hào)后面的花括號(hào)內(nèi)提供實(shí)參。如
   

 Student stud[3]={60,70,78}; //合法,3個(gè)實(shí)參分別傳遞給3個(gè)數(shù)組元素的構(gòu)造函數(shù)


如果構(gòu)造函數(shù)有多個(gè)參數(shù),則不能用在定義數(shù)組時(shí)直接提供所有實(shí)參的方法,因?yàn)橐粋€(gè)數(shù)組有多個(gè)元素,對(duì)每個(gè)元素要提供多個(gè)實(shí)參,如果再考慮到構(gòu)造函數(shù)有默認(rèn)參數(shù)的情況,很容易造成實(shí)參與形參的對(duì)應(yīng)關(guān)系不清晰,出現(xiàn)歧義性。例如,類(lèi)Student的構(gòu)造函數(shù)有多個(gè)參數(shù),且為默認(rèn)參數(shù):
  

Student:: Student(int=1001,int=18,int=60); //定義構(gòu)造函數(shù),有多個(gè)參數(shù),且為默認(rèn)參數(shù)


如果定義對(duì)象數(shù)組的語(yǔ)句為

  Student stud[3]={1005,60,70};


在程序中最好不要采用這種容易引起歧義性的方法。

編譯系統(tǒng)只為每個(gè)對(duì)象元素的構(gòu)造函數(shù)傳遞一個(gè)實(shí)參,所以在定義數(shù)組時(shí)提供的實(shí)參個(gè)數(shù)不能超過(guò)數(shù)組元素個(gè)數(shù),如

  Student stud[3]={60,70,78,45}; //不合法,實(shí)參個(gè)數(shù)超過(guò)對(duì)象數(shù)組元素個(gè)數(shù)


那么,如果構(gòu)造函數(shù)有多個(gè)參數(shù),在定義對(duì)象數(shù)組時(shí)應(yīng)當(dāng)怎樣實(shí)現(xiàn)初始化呢?回答是: 在花括號(hào)中分別寫(xiě)出構(gòu)造函數(shù)并指定實(shí)參。

如果構(gòu)造函數(shù)有3個(gè)參數(shù),分別代表學(xué)號(hào)、年齡、成績(jī)。則可以這樣定義對(duì)象數(shù)組:

Student Stud[3]={ //定義對(duì)象數(shù)組
  Student(1001,18,87), //調(diào)用第1個(gè)元素的構(gòu)造函數(shù),為它提供3個(gè)實(shí)參
  Student(1002,19,76), //調(diào)用第2個(gè)元素的構(gòu)造函數(shù),為它提供3個(gè)實(shí)參
  Student(1003,18,72) //調(diào)用第3個(gè)元素的構(gòu)造函數(shù),為它提供3個(gè)實(shí)參
};

在建立對(duì)象數(shù)組時(shí),分別調(diào)用構(gòu)造函數(shù),對(duì)每個(gè)元素初始化。每一個(gè)元素的實(shí)參分別用括號(hào)包起來(lái),對(duì)應(yīng)構(gòu)造函數(shù)的一組形參,不會(huì)混淆。

[例] 對(duì)象數(shù)組的使用方法。

#include <iostream>
using namespace std;
class Box
{
public :
  //聲明有默認(rèn)參數(shù)的構(gòu)造函數(shù),用參數(shù)初始化表對(duì)數(shù)據(jù)成員初始化
  Box(int h=10,int w=12,int len=15): height(h),width(w),length(len){ }
  int volume( );
private :
  int height;
  int width;
  int length;
};
int Box::volume( )
{
  return (height*width*length);
}
int main( )
{
  Box a[3]={ //定義對(duì)象數(shù)組
   Box(10,12,15), //調(diào)用構(gòu)造函數(shù)Box,提供第1個(gè)元素的實(shí)參
   Box(15,18,20), //調(diào)用構(gòu)造函數(shù)Box,提供第2個(gè)元素的實(shí)參
   Box(16,20,26) //調(diào)用構(gòu)造函數(shù)Box,提供第3個(gè)元素的實(shí)參
  };
  cout<<"volume of a[0] is "<<a[0].volume( )<<endl;
  cout<<"volume of a[1] is "<<a[1].volume( )<<endl;
  cout<<"volume of a[2] is "<<a[2].volume( )<<endl;
  return 0;
}

運(yùn)行結(jié)果如下:

volume of a[0] is 1800
volume of a[1] is 5400
volume of a[2] is 8320

相關(guān)文章

  • vscode+platformIO開(kāi)發(fā)stm32f4的實(shí)現(xiàn)

    vscode+platformIO開(kāi)發(fā)stm32f4的實(shí)現(xiàn)

    這篇文章主要介紹了vscode+platformIO開(kāi)發(fā)stm32f4的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦)

    vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦)

    這篇文章主要介紹了vs code 配置c/c++環(huán)境的詳細(xì)教程(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 解決C語(yǔ)言輸入單個(gè)字符屏蔽回車(chē)符的問(wèn)題

    解決C語(yǔ)言輸入單個(gè)字符屏蔽回車(chē)符的問(wèn)題

    這篇文章主要介紹了解決C語(yǔ)言輸入單個(gè)字符屏蔽回車(chē)符的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • C++實(shí)現(xiàn)線性表鏈?zhǔn)酱鎯?chǔ)(單鏈)

    C++實(shí)現(xiàn)線性表鏈?zhǔn)酱鎯?chǔ)(單鏈)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性表鏈?zhǔn)酱鎯?chǔ),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++超詳細(xì)講解運(yùn)算符重載

    C++超詳細(xì)講解運(yùn)算符重載

    本文包括了對(duì)C++類(lèi)的6個(gè)默認(rèn)成員函數(shù)中的賦值運(yùn)算符重載和取地址和const對(duì)象取地址操作符的重載。運(yùn)算符是程序中最最常見(jiàn)的操作,例如對(duì)于內(nèi)置類(lèi)型的賦值我們直接使用=賦值即可,因?yàn)檫@些編譯器已經(jīng)幫我們做好了,但是對(duì)象的賦值呢?能直接賦值嗎
    2022-06-06
  • c語(yǔ)言 字符串轉(zhuǎn)大寫(xiě)的簡(jiǎn)單實(shí)例

    c語(yǔ)言 字符串轉(zhuǎn)大寫(xiě)的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了c語(yǔ)言 字符串轉(zhuǎn)大寫(xiě)的簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的抽獎(jiǎng)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 論C++的lambda是函數(shù)還是對(duì)象

    論C++的lambda是函數(shù)還是對(duì)象

    這篇文章主要介紹了論C++的lambda是函數(shù)還是對(duì)象,對(duì)于有捕獲的lambda,其等價(jià)于對(duì)象。對(duì)于沒(méi)有任何捕獲的lambda,其等價(jià)于函數(shù),下面來(lái)看看具體的相關(guān)內(nèi)容,需要的朋友可以參考一下
    2022-02-02
  • C++ Boost Pool超詳細(xì)講解

    C++ Boost Pool超詳細(xì)講解

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-11-11
  • C語(yǔ)言指針入門(mén)學(xué)習(xí)面面觀

    C語(yǔ)言指針入門(mén)學(xué)習(xí)面面觀

    這篇文章主要介紹了C語(yǔ)言指針的一些基礎(chǔ)知識(shí),指針可以說(shuō)是C語(yǔ)言入門(mén)學(xué)習(xí)中的頭等大事,文中從數(shù)組和函數(shù)等多方面剖析C中指針的作用,需要的朋友可以參考下
    2016-02-02

最新評(píng)論