C++數(shù)據(jù)封裝以及定義結(jié)構(gòu)的詳細(xì)講解
先介紹一個(gè)字符串比較函數(shù):strcmp(s1,s2),當(dāng)s1<s2時(shí),返回一個(gè)負(fù)整數(shù);當(dāng)s1=s2時(shí),返回值為0;當(dāng)s1>s2時(shí),返回一個(gè)正整數(shù)
還有一個(gè)字符串復(fù)制函數(shù):strcpy(a,b),表示將字符串b的值復(fù)制給字符串a(chǎn)當(dāng)然字符串b的長(zhǎng)度不能超過(guò)字符串a(chǎn)
定義結(jié)構(gòu)
為了定義結(jié)構(gòu),您必須使用 struct 語(yǔ)句。struct 語(yǔ)句定義了一個(gè)包含多個(gè)成員的新的數(shù)據(jù)類型,struct 語(yǔ)句的格式如下:
struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; . . } object_names;
type_name 是結(jié)構(gòu)體類型的名稱,member_type1 member_name1 是標(biāo)準(zhǔn)的變量定義,比如 int i; 或者 float f; 或者其他有效的變量定義。在結(jié)構(gòu)定義的末尾,最后一個(gè)分號(hào)之前,您可以指定一個(gè)或多個(gè)結(jié)構(gòu)變量,這是可選的。下面是聲明一個(gè)結(jié)構(gòu)體類型 Books,變量為 book:
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
訪問(wèn)結(jié)構(gòu)成員
為了訪問(wèn)結(jié)構(gòu)的成員,我們使用成員訪問(wèn)運(yùn)算符(.)。成員訪問(wèn)運(yùn)算符是結(jié)構(gòu)變量名稱和我們要訪問(wèn)的結(jié)構(gòu)成員之間的一個(gè)句號(hào)。
下面的實(shí)例演示了結(jié)構(gòu)的用法:
#include <iostream> #include <cstring> using namespace std; // 聲明一個(gè)結(jié)構(gòu)體類型 Books struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // 定義結(jié)構(gòu)體類型 Books 的變量 Book1 Books Book2; // 定義結(jié)構(gòu)體類型 Books 的變量 Book2 // Book1 詳述 strcpy( Book1.title, "C++ 教程"); strcpy( Book1.author, "Runoob"); strcpy( Book1.subject, "編程語(yǔ)言"); Book1.book_id = 12345; // Book2 詳述 strcpy( Book2.title, "CSS 教程"); strcpy( Book2.author, "Runoob"); strcpy( Book2.subject, "前端技術(shù)"); Book2.book_id = 1234556; // 輸出 Book1 信息 cout << "第一本書(shū)標(biāo)題 : " << Book1.title <<endl; cout << "第一本書(shū)作者 : " << Book1.author <<endl; cout << "第一本書(shū)類目 : " << Book1.subject <<endl; cout << "第一本書(shū) ID : " << Book1.book_id <<endl; // 輸出 Book2 信息 cout << "第二本書(shū)標(biāo)題 : " << Book2.title <<endl; cout << "第二本書(shū)作者 : " << Book2.author <<endl; cout << "第二本書(shū)類目 : " << Book2.subject <<endl; cout << "第二本書(shū) ID : " << Book2.book_id <<endl; return 0; }
實(shí)例中定義了結(jié)構(gòu)體類型 Books 及其兩個(gè)變量 Book1 和 Book2。當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
第一本書(shū)標(biāo)題:C++教程
第一本書(shū)作者:Runoob
第一本書(shū)類目:編程語(yǔ)言
第一本書(shū)ID:12345
第一本書(shū)標(biāo)題:CSS教程
第一本書(shū)作者:Runoob
第一本書(shū)類目:前端技術(shù)
第一本書(shū)ID:123456
結(jié)構(gòu)作為函數(shù)參數(shù)
您可以把結(jié)構(gòu)作為函數(shù)參數(shù),傳參方式與其他類型的變量或指針類似。您可以使用上面實(shí)例中的方式來(lái)訪問(wèn)結(jié)構(gòu)變量:
#include <iostream> #include <cstring> using namespace std; void printBook( struct Books book ); // 聲明一個(gè)結(jié)構(gòu)體類型 Books struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // 定義結(jié)構(gòu)體類型 Books 的變量 Book1 Books Book2; // 定義結(jié)構(gòu)體類型 Books 的變量 Book2 // Book1 詳述 strcpy( Book1.title, "C++ 教程"); strcpy( Book1.author, "Runoob"); strcpy( Book1.subject, "編程語(yǔ)言"); Book1.book_id = 12345; // Book2 詳述 strcpy( Book2.title, "CSS 教程"); strcpy( Book2.author, "Runoob"); strcpy( Book2.subject, "前端技術(shù)"); Book2.book_id = 1234556; // 輸出 Book1 信息 printBook( Book1 ); // 輸出 Book2 信息 printBook( Book2 ); return 0; } void printBook( struct Books book ) { cout << "書(shū)標(biāo)題 : " << book.title <<endl; cout << "書(shū)作者 : " << book.author <<endl; cout << "書(shū)類目 : " << book.subject <<endl; cout << "書(shū) ID : " << book.book_id <<endl; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
書(shū)標(biāo)題:C++教程
書(shū)作者:Runoob
書(shū)類目:編程語(yǔ)言
書(shū)ID:12345
書(shū)標(biāo)題:CSS教程
書(shū)作者:Runoob
書(shū)類目:前端技術(shù)
書(shū)ID:123456
指向結(jié)構(gòu)的指針
您可以定義指向結(jié)構(gòu)的指針,方式與定義指向其他類型變量的指針相似,如下所示:
struct Books *struct_pointer;
現(xiàn)在,您可以在上述定義的指針變量中存儲(chǔ)結(jié)構(gòu)變量的地址。為了查找結(jié)構(gòu)變量的地址,請(qǐng)把 & 運(yùn)算符放在結(jié)構(gòu)名稱的前面,如下所示:
struct_pointer = &Book1;
為了使用指向該結(jié)構(gòu)的指針訪問(wèn)結(jié)構(gòu)的成員,您必須使用 -> 運(yùn)算符,如下所示:
struct_pointer->title;
讓我們使用結(jié)構(gòu)指針來(lái)重寫(xiě)上面的實(shí)例,這將有助于您理解結(jié)構(gòu)指針的概念:
#include <iostream> #include <cstring> using namespace std; void printBook( struct Books *book ); struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; int main( ) { Books Book1; // 定義結(jié)構(gòu)體類型 Books 的變量 Book1 Books Book2; // 定義結(jié)構(gòu)體類型 Books 的變量 Book2 // Book1 詳述 strcpy( Book1.title, "C++ 教程"); strcpy( Book1.author, "Runoob"); strcpy( Book1.subject, "編程語(yǔ)言"); Book1.book_id = 12345; // Book2 詳述 strcpy( Book2.title, "CSS 教程"); strcpy( Book2.author, "Runoob"); strcpy( Book2.subject, "前端技術(shù)"); Book2.book_id = 1234556; // 通過(guò)傳 Book1 的地址來(lái)輸出 Book1 信息 printBook( &Book1 ); // 通過(guò)傳 Book2 的地址來(lái)輸出 Book2 信息 printBook( &Book2 ); return 0; } // 該函數(shù)以結(jié)構(gòu)指針作為參數(shù) void printBook( struct Books *book ) { cout << "書(shū)標(biāo)題 : " << book->title <<endl; cout << "書(shū)作者 : " << book->author <<endl; cout << "書(shū)類目 : " << book->subject <<endl; cout << "書(shū) ID : " << book->book_id <<endl; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
書(shū)標(biāo)題:C++教程
書(shū)作者:Runoob
書(shū)類目:編程語(yǔ)言
書(shū)ID:12345
書(shū)標(biāo)題:CSS教程
書(shū)作者:Runoob
書(shū)類目:前端技術(shù)
書(shū)ID:123456
typedef 關(guān)鍵字
下面是一種更簡(jiǎn)單的定義結(jié)構(gòu)的方式,您可以為創(chuàng)建的類型取一個(gè)"別名"。例如:
typedef struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }Books;
現(xiàn)在,您可以直接使用 Books 來(lái)定義 Books 類型的變量,而不需要使用 struct 關(guān)鍵字。下面是實(shí)例:
Books Book1, Book2;
您可以使用 typedef 關(guān)鍵字來(lái)定義非結(jié)構(gòu)類型,如下所示:
typedef long int *pint32; pint32 x, y, z;
x, y 和 z 都是指向長(zhǎng)整型 long int 的指針。
C++ 數(shù)據(jù)封裝
所有的 C++ 程序都有以下兩個(gè)基本要素:
- 程序語(yǔ)句(代碼):這是程序中執(zhí)行動(dòng)作的部分,它們被稱為函數(shù)。
- 程序數(shù)據(jù):數(shù)據(jù)是程序的信息,會(huì)受到程序函數(shù)的影響。
封裝是面向?qū)ο缶幊讨械陌褦?shù)據(jù)和操作數(shù)據(jù)的函數(shù)綁定在一起的一個(gè)概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。數(shù)據(jù)封裝引申出了另一個(gè)重要的 OOP 概念,即數(shù)據(jù)隱藏。
數(shù)據(jù)封裝是一種把數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起的機(jī)制,數(shù)據(jù)抽象是一種僅向用戶暴露接口而把具體的實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái)的機(jī)制。
C++ 通過(guò)創(chuàng)建類來(lái)支持封裝和數(shù)據(jù)隱藏(public、protected、private)。我們已經(jīng)知道,類包含私有成員(private)、保護(hù)成員(protected)和公有成員(public)成員。默認(rèn)情況下,在類中定義的所有項(xiàng)目都是私有的。例如:
class Box { public: double getVolume(void) { return length * breadth * height; } private: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 };
變量 length、breadth 和 height 都是私有的(private)。這意味著它們只能被 Box 類中的其他成員訪問(wèn),而不能被程序中其他部分訪問(wèn)。這是實(shí)現(xiàn)封裝的一種方式。
為了使類中的成員變成公有的(即,程序中的其他部分也能訪問(wèn)),必須在這些成員前使用 public 關(guān)鍵字進(jìn)行聲明。所有定義在 public 標(biāo)識(shí)符后邊的變量或函數(shù)可以被程序中所有其他的函數(shù)訪問(wèn)。
把一個(gè)類定義為另一個(gè)類的友元類,會(huì)暴露實(shí)現(xiàn)細(xì)節(jié),從而降低了封裝性。理想的做法是盡可能地對(duì)外隱藏每個(gè)類的實(shí)現(xiàn)細(xì)節(jié)。
數(shù)據(jù)封裝的實(shí)例
C++ 程序中,任何帶有公有和私有成員的類都可以作為數(shù)據(jù)封裝和數(shù)據(jù)抽象的實(shí)例。請(qǐng)看下面的實(shí)例:
#include <iostream> using namespace std; class Adder{ public: // 構(gòu)造函數(shù) Adder(int i = 0) { total = i; } // 對(duì)外的接口 void addNum(int number) { total += number; } // 對(duì)外的接口 int getTotal() { return total; }; private: // 對(duì)外隱藏的數(shù)據(jù) int total; }; int main( ) { Adder a; a.addNum(10); a.addNum(20); a.addNum(30); cout << "Total " << a.getTotal() <<endl; return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Total 60
上面的類把數(shù)字相加,并返回總和。公有成員 addNum 和 getTotal 是對(duì)外的接口,用戶需要知道它們以便使用類。私有成員 total 是對(duì)外隱藏的,用戶不需要了解它,但它又是類能正常工作所必需的。
設(shè)計(jì)策略
通常情況下,我們都會(huì)設(shè)置類成員狀態(tài)為私有(private),除非我們真的需要將其暴露,這樣才能保證良好的封裝性。
這通常應(yīng)用于數(shù)據(jù)成員,但它同樣適用于所有成員,包括虛函數(shù)。
C++ 類 & 對(duì)象
C++ 在 C 語(yǔ)言的基礎(chǔ)上增加了面向?qū)ο缶幊?,C++ 支持面向?qū)ο蟪绦蛟O(shè)計(jì)。類是 C++ 的核心特性,通常被稱為用戶定義的類型。
類用于指定對(duì)象的形式,是一種用戶自定義的數(shù)據(jù)類型,它是一種封裝了數(shù)據(jù)和函數(shù)的組合。類中的數(shù)據(jù)稱為成員變量,函數(shù)稱為成員函數(shù)。類可以被看作是一種模板,可以用來(lái)創(chuàng)建具有相同屬性和行為的多個(gè)對(duì)象。
C++ 類定義
定義一個(gè)類需要使用關(guān)鍵字 class,然后指定類的名稱,并類的主體是包含在一對(duì)花括號(hào)中,主體包含類的成員變量和成員函數(shù)。
定義一個(gè)類,本質(zhì)上是定義一個(gè)數(shù)據(jù)類型的藍(lán)圖,它定義了類的對(duì)象包括了什么,以及可以在這個(gè)對(duì)象上執(zhí)行哪些操作。
以下實(shí)例我們使用關(guān)鍵字 class 定義 Box 數(shù)據(jù)類型,包含了三個(gè)成員變量 length、breadth 和 height:
class Box { public: double length; // 盒子的長(zhǎng)度 double breadth; // 盒子的寬度 double height; // 盒子的高度 };
關(guān)鍵字 public 確定了類成員的訪問(wèn)屬性。在類對(duì)象作用域內(nèi),公共成員在類的外部是可訪問(wèn)的。您也可以指定類的成員為 private 或 protected,這個(gè)我們稍后會(huì)進(jìn)行講解。
定義 C++ 對(duì)象
類提供了對(duì)象的藍(lán)圖,所以基本上,對(duì)象是根據(jù)類來(lái)創(chuàng)建的。聲明類的對(duì)象,就像聲明基本類型的變量一樣。下面的語(yǔ)句聲明了類 Box 的兩個(gè)對(duì)象:
Box Box1; // 聲明 Box1,類型為 Box Box Box2; // 聲明 Box2,類型為 Box
對(duì)象 Box1 和 Box2 都有它們各自的數(shù)據(jù)成員。
訪問(wèn)數(shù)據(jù)成員
類的對(duì)象的公共數(shù)據(jù)成員可以使用直接成員訪問(wèn)運(yùn)算符 . 來(lái)訪問(wèn)。
為了更好地理解這些概念,讓我們嘗試一下下面的實(shí)例:
#include <iostream> using namespace std; class Box { public: double length; // 長(zhǎng)度 double breadth; // 寬度 double height; // 高度 // 成員函數(shù)聲明 double get(void); void set( double len, double bre, double hei ); }; // 成員函數(shù)定義 double Box::get(void) { return length * breadth * height; } void Box::set( double len, double bre, double hei) { length = len; breadth = bre; height = hei; } int main( ) { Box Box1; // 聲明 Box1,類型為 Box Box Box2; // 聲明 Box2,類型為 Box Box Box3; // 聲明 Box3,類型為 Box double volume = 0.0; // 用于存儲(chǔ)體積 // box 1 詳述 Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0; // box 2 詳述 Box2.height = 10.0; Box2.length = 12.0; Box2.breadth = 13.0; // box 1 的體積 volume = Box1.height * Box1.length * Box1.breadth; cout << "Box1 的體積:" << volume <<endl; // box 2 的體積 volume = Box2.height * Box2.length * Box2.breadth; cout << "Box2 的體積:" << volume <<endl; // box 3 詳述 Box3.set(16.0, 8.0, 12.0); volume = Box3.get(); cout << "Box3 的體積:" << volume <<endl; return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
Box1的體積:210
Box2的體積:1560
Box3的體積:1536
需要注意的是,私有的成員和受保護(hù)的成員不能使用直接成員訪問(wèn)運(yùn)算符 (.) 來(lái)直接訪問(wèn)。我們將在后續(xù)的教程中學(xué)習(xí)如何訪問(wèn)私有成員和受保護(hù)的成員。
以上就是C++數(shù)據(jù)封裝以及定義結(jié)構(gòu)的詳細(xì)講解的詳細(xì)內(nèi)容,更多關(guān)于C++數(shù)據(jù)封裝以及定義結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Cocos2d-x中使用CCScrollView來(lái)實(shí)現(xiàn)關(guān)卡選擇實(shí)例
這篇文章主要介紹了Cocos2d-x中使用CCScrollView來(lái)實(shí)現(xiàn)關(guān)卡的選擇實(shí)例,本文在代碼中用大量注釋講解了CCScrollView的使用,需要的朋友可以參考下2014-09-09C語(yǔ)言中枚舉與聯(lián)合體的使用方法(enum union)
枚舉的意思就是列舉,將每一個(gè)可能的取值都進(jìn)行一一列舉,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中枚舉與聯(lián)合體的使用方法,需要的朋友可以參考下2021-09-09簡(jiǎn)單舉例說(shuō)明C++中break和continue語(yǔ)句的用法
這篇文章主要介紹了簡(jiǎn)單舉例說(shuō)明C++中break和continue語(yǔ)句的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)只是,需要的朋友可以參考下2015-09-09C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果流程詳解
EasyX是針對(duì)C/C++的圖形庫(kù),可以幫助使用C/C++語(yǔ)言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫(kù)實(shí)現(xiàn)三星環(huán)繞效果,需要的可以參考一下2022-10-10C++11的for循環(huán),以及范圍Range類的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇C++11的for循環(huán),以及范圍Range類的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的, 現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06C++類靜態(tài)成員與類靜態(tài)成員函數(shù)詳解
靜態(tài)成員不可在類體內(nèi)進(jìn)行賦值,因?yàn)樗潜凰性擃惖膶?duì)象所共享的。你在一個(gè)對(duì)象里給它賦值,其他對(duì)象里的該成員也會(huì)發(fā)生變化。為了避免混亂,所以不可在類體內(nèi)進(jìn)行賦值2013-09-09