詳解C++編程中類的聲明和對(duì)象成員的引用
C++類的聲明和對(duì)象的創(chuàng)建
類是創(chuàng)建對(duì)象的模板,一個(gè)類可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類類型的一個(gè)變量;創(chuàng)建對(duì)象的過程也叫類的實(shí)例化。每個(gè)對(duì)象都是類的一個(gè)具體實(shí)例(Instance),擁有類的成員變量和成員函數(shù)。
與結(jié)構(gòu)體一樣,類只是一種復(fù)雜數(shù)據(jù)類型的聲明,不占用內(nèi)存空間。而對(duì)象是類這種數(shù)據(jù)類型的一個(gè)變量,占用內(nèi)存空間。
類的聲明
類是用戶自定義的類型,如果程序中要用到類,必須先進(jìn)行聲明,或者使用已存在的類(別人寫好的類、標(biāo)準(zhǔn)庫中的類等),C++語法本身并不提供現(xiàn)成的類的名稱、結(jié)構(gòu)和內(nèi)容。
一個(gè)簡(jiǎn)單的類的定義:
class Student{ //成員變量 char *name; int age; float score; //成員函數(shù) void say(){ printf("%s的年齡是 %d,成績是 %f\n", name, age, score); } };
該例創(chuàng)建了一個(gè)Student類,它包含了3個(gè)成員變量和1個(gè)成員函數(shù)。
class是C++中的關(guān)鍵字,用于聲明一個(gè)類;緊接 class 關(guān)鍵字之后的是我們自定義的類名 Student;由{ }包圍的是類體。聲明類時(shí)不能對(duì)成員變量進(jìn)行初始化,只有在創(chuàng)建對(duì)象以后才能賦值。
類可以理解為一種新的數(shù)據(jù)類型,該數(shù)據(jù)類型的名稱是 Student。與 char、int、float 等基本數(shù)據(jù)類型不同的是,Student 是一種復(fù)雜數(shù)據(jù)類型,可以包含基本類型,而且多了很多基本類型中沒有的特性。
需要注意的是:在類聲明的最后有一個(gè)分號(hào)(;),它是類聲明的一部分,表示類聲明結(jié)束了,不能省略。
創(chuàng)建對(duì)象
聲明了 Student 數(shù)據(jù)類型之后,就可以用它來定義變量了,如:
Student LiLei; //創(chuàng)建對(duì)象
該語句聲明了一個(gè)名字為 LiLei、數(shù)據(jù)類型為 Student 的變量。這和:
int a; //定義整形變量
語句定義了一個(gè)整型變量表達(dá)的意思是類似的。而 LiLei 這個(gè)變量我們稱之為 Student 類的對(duì)象。
在定義類的對(duì)象時(shí),class 關(guān)鍵字可要可不要。但出于習(xí)慣我們通常都會(huì)省略掉class關(guān)鍵字,例如:
class Student LiLei; //正確 Student LiLei; //同樣正確
創(chuàng)建類的對(duì)象時(shí),除了能定義單個(gè)變量以外,還可以定義一個(gè)數(shù)組或者指針。例如:
Student all_student[100]; Student *pointer;
第一條語句定義了一個(gè) all_student 數(shù)組,該數(shù)據(jù)擁有100個(gè)元素,每個(gè)元素都是 Student 類型。第二條語句定義了一個(gè) Student 類型的指針 pointer,該指針可以指向 Student 類型的變量(對(duì)象),用法和普通指針一樣。
聲明類的同時(shí)創(chuàng)建對(duì)象
和結(jié)構(gòu)體(struct)類似,你可以先聲明類,然后再創(chuàng)建對(duì)象,也可以在聲明類的同時(shí)創(chuàng)建對(duì)象。如下所示:
class Student{ //成員變量 char *name; int age; float score; //成員函數(shù) void say(){ printf("%s的年齡是 %d,成績是 %f\n", name, age, score); } }stu1, stu2;
這個(gè)時(shí)候你也可以省略類名,直接創(chuàng)建對(duì)象。如下所示:
class{ //成員變量 char *name; int age; float score; //成員函數(shù) void say(){ printf("%s的年齡是 %d,成績是 %f\n", name, age, score); } }stu1, stu2;
直接定義對(duì)象,在C++中是合法的、允許的,但卻很少用,也不提倡用。
一個(gè)完整的示例:
#include <stdio.h> //類可以在所有函數(shù)之外定義 class Student{ public: //類包含的變量 char *name; int age; float score; public: //類包含的函數(shù) void say(){ printf("%s的年齡是 %d,成績是 %f\n", name, age, score); } }; int main(){ //創(chuàng)建對(duì)象 Student stu; stu.name = "小明"; stu.age = 15; stu.score = 92.5f; stu.say(); //定義指針 Student *pt_stu = &stu; pt_stu->name = "李雷"; pt_stu->age = 16; pt_stu->score = 80; pt_stu->say(); return 0; }
運(yùn)行結(jié)果:
小明的年齡是 15,成績是 92.500000 李雷的年齡是 16,成績是 80.000000
public 是C++中的關(guān)鍵字,用來修飾成員變量和成員函數(shù),表示它們是公有的。我們將在下節(jié)詳細(xì)講解 public,這里只需要知道,只有 public 后面的成員變量和成員函數(shù)才能被創(chuàng)建的對(duì)象訪問到。像本節(jié)開頭的例子,沒有使用 public,那么創(chuàng)建對(duì)象后就不能使用任何成員。
main 函數(shù)中首先創(chuàng)建了一個(gè)對(duì)象 stu,然后又定義了一個(gè) Student 類型的指針變量。可以發(fā)現(xiàn),和結(jié)構(gòu)體(struct)類似,一個(gè)對(duì)象通過成員選擇符”.“來訪問成員變量和成員函數(shù),而指針變量通過指針操作符”->“來訪問成員。
對(duì)象指針和結(jié)構(gòu)體指針類似。
注意:對(duì)象指針指向的是一個(gè)具體的對(duì)象,而不是類。下面的寫法是錯(cuò)誤的:
Student *pt; pt = &Student;
C++對(duì)象成員的引用
在程序中經(jīng)常需要訪問對(duì)象中的成員。訪問對(duì)象中的成員可以有3種方法:
- 通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員;
- 通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員;
- 通過對(duì)象的引用變量訪問對(duì)象中的成員。
通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員
例如在程序中可以寫出以下語句:
stud1.num=1001; //假設(shè)num已定義為公用的整型數(shù)據(jù)成員
表示將整數(shù)1001賦給對(duì)象stud1中的數(shù)據(jù)成員num。其中“.”是成員運(yùn)算符,用來對(duì)成員進(jìn)行限定,指明所訪問的是哪一個(gè)對(duì)象中的成員。注意不能只寫成員名而忽略對(duì)象名。
訪問對(duì)象中成員的一般形式為:
對(duì)象名.成員名
不僅可以在類外引用對(duì)象的公用數(shù)據(jù)成員,而且還可以調(diào)用對(duì)象的公用成員函數(shù),但同樣必須指出對(duì)象名,如:
stud1.display( ); //正確,調(diào)用對(duì)象stud1的公用成員函數(shù) display( ); //錯(cuò)誤,沒有指明是哪一個(gè)對(duì)象的display函數(shù)
由于沒有指明對(duì)象名,編譯時(shí)把display作為普通函數(shù)處理。應(yīng)該注意所訪問的成員是公用的(public )還是私有的(private ),只能訪問public成員,而不能訪問private成員。如果已定義num為私有數(shù)據(jù)成員,下面的語句是錯(cuò)誤的:
stud1.num=10101; //num是私有數(shù)據(jù)成員,不能被外界引用
在類外只能調(diào)用公用的成員函數(shù)。在一個(gè)類中應(yīng)當(dāng)至少有一個(gè)公用的成員函數(shù),作為對(duì)外的接口,否則就無法對(duì)對(duì)象進(jìn)行任何操作。
通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員
前面已經(jīng)介紹了指向結(jié)構(gòu)體變量的指針(詳情請(qǐng)猛擊:指向結(jié)構(gòu)體變量的指針),可以通過指針引用結(jié)構(gòu)體中的成員。用指針訪問對(duì)象中的成員的方法與此類似。如果有以下程序段:
class Time { public : //數(shù)據(jù)成員是公用的 int hour; int minute; }; Time t, *p; //定義對(duì)象t和指針變量p p=&t; //使p指向?qū)ο髏 cout<<p->hour; //輸出p指向的對(duì)象中的成員hour
在p指向t的前提下,p->hour,(*p).hour和t.hour三者等價(jià)。
通過對(duì)象的引用變量來訪問對(duì)象中的成員
如果為一個(gè)對(duì)象定義了一個(gè)引用變量,它們是共占同一段存儲(chǔ)單元的,實(shí)際上它們是同一個(gè)對(duì)象,只是用不同的名字表示而已。因此完全可以通過引用變量來訪問對(duì)象中的成員。
如果已聲明了Time類,并有以下定義語句:
Time t1; //定義對(duì)象t1 Time &t2=t1; //定義Time類引用變量t2,并使之初始化為t1 cout<<t2.hour; //輸出對(duì)象t1中的成員hour
由于t2與t1共占同一段存儲(chǔ)單元(即t2是t1的別名),因此t2.hour就是t1.hour。
相關(guān)文章
關(guān)于STL的erase()陷阱-迭代器失效問題的總結(jié)
下面小編就為大家?guī)硪黄P(guān)于STL的erase()陷阱-迭代器失效問題的總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12Qt實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到xls的示例代碼
導(dǎo)入導(dǎo)出數(shù)據(jù)到csv由于語法簡(jiǎn)單,適用場(chǎng)景有限,于是本文將為大家介紹Qt如何實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)到xls,感興趣的小伙伴可以跟隨小編一起試一試2022-01-01C語言控制臺(tái)實(shí)現(xiàn)字符飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了C語言控制臺(tái)實(shí)現(xiàn)字符飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12詳解如何在VS2019和VScode中配置C++調(diào)用python接口
這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12