C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)
1. 類的定義
類定義是以關(guān)鍵字 class 開(kāi)頭,后跟類的名稱。并在它后面依次包含類名,一組放在 {} 內(nèi)的成員屬性和成員函數(shù),以及結(jié)尾的分號(hào)。
類聲明將類本身及其屬性告訴編譯器。類聲明本身并不能改變程序的行為,它定義了類的對(duì)象包括了什么,以及可以在這個(gè)對(duì)象上執(zhí)行哪些操作。
例如,我們使用關(guān)鍵字 class 定義 Box 數(shù)據(jù)類型,如下所示:
class Box
{// 成員屬性double length; // 盒子的長(zhǎng)度double breadth; // 盒子的寬度double height; // 盒子的高度// 成員函數(shù)double getVolume(void); // 返回體積
};
有時(shí)候也會(huì)把類成員的函數(shù)叫做“方法”。
2. 類實(shí)例對(duì)象的定義
類相當(dāng)于藍(lán)圖,僅聲明類并不會(huì)對(duì)程序的執(zhí)行產(chǎn)生影響。在程序執(zhí)行階段,對(duì)象是類的化身。要使用類的功能,通常需要?jiǎng)?chuàng)建其實(shí)例——對(duì)象,并通過(guò)對(duì)象訪問(wèn)成員方法和屬性。
聲明類的對(duì)象,就像聲明基本類型的變量一樣。
double pi= 3.1415;
Box Box1; // 聲明 Box1,類型為 Box
Box Box2; // 聲明 Box2,類型為 Box
對(duì)象 Box1 和 Box2 都有它們各自的數(shù)據(jù)成員。
就像可以為其他類型(如 int )動(dòng)態(tài)分配內(nèi)存一樣,也可使用 new 為 Box 對(duì)象動(dòng)態(tài)地分配內(nèi)存:
int* a = new int;
delete a;
Box* box = new Box();
delete box;
3. 訪問(wèn)類成員
類的對(duì)象的公共數(shù)據(jù)成員可以使用直接成員訪問(wèn)運(yùn)算符 . 來(lái)訪問(wèn)。示例:
#include <iostream>
using namespace std;class Box
{public:double length;double width;double height;
};int main()
{Box box1; // box1,類型為 BoxBox box2;double volume = 0.0;box1.length = 1;box1.width = 2;box1.height = 3;box2.length = 4;box2.width = 5;box2.height = 6;volume = box1.length * box1.width * box1.height;cout << "box1 vloume is " << volume << endl;volume = box2.length * box2.width * box2.height;cout << "box2 vloume is " << volume << endl;return 0;
}
如果有一個(gè)指針 box,它指向 Box 類的一個(gè)實(shí)例,則可使用指針運(yùn)算符 -> 來(lái)訪問(wèn)成員,也可使用間接運(yùn)算符 * 來(lái)獲取對(duì)象,再使用句點(diǎn)運(yùn)算符來(lái)訪問(wèn)成員:
Box* box = new Box();
(*box).getVolume();
4. 類成員函數(shù)
類的成員函數(shù)是指那些把定義和原型寫(xiě)在類定義內(nèi)部的函數(shù),就像類定義中的其他變量一樣。類成員函數(shù)是類的一個(gè)成員,它可以操作類的任意對(duì)象,可以訪問(wèn)對(duì)象中的所有成員。
成員函數(shù)可以定義在類定義內(nèi)部,或者單獨(dú)使用范圍解析運(yùn)算符 :: 來(lái)定義。在類內(nèi)部定義中定義的成員函數(shù)把函數(shù)聲明為內(nèi)聯(lián)的(關(guān)于內(nèi)聯(lián),請(qǐng)參考https://www.runoob.com/w3cnote/cpp-inline-usage.html),即便沒(méi)有使用 inline 標(biāo)識(shí)符。
將成員函數(shù)的定義放在類定義內(nèi)有兩個(gè)作用:
- 函數(shù)將成為內(nèi)聯(lián)的
inline,即編譯器為此函數(shù)的調(diào)用生成代碼時(shí),不會(huì)生成真正的函數(shù)調(diào)用,而是將其代碼嵌入到調(diào)用者的代碼中 。 對(duì)于較小的函數(shù),這種編譯方式會(huì)帶來(lái)很大的性能提升 ; - 每當(dāng)我們對(duì)內(nèi)聯(lián)函數(shù)體做出修改時(shí), 所有使用這個(gè)類的程序都不得不重新編譯;
- 如果函數(shù)體位于類聲明之外,就不必這樣 ,只在類接口改變時(shí)才需要重新編譯用戶程序,對(duì)于大程序來(lái)說(shuō),函數(shù)體改變時(shí)無(wú)須重新編譯程序會(huì)是一個(gè)巨大的優(yōu)勢(shì) 。
- 類定義變大了 。 因此 ,在成員函數(shù)定義中找到成員會(huì)變得困難 。
顯然,我們應(yīng)遵循如下基本原則: 除非你明確需要從小函數(shù)的內(nèi)聯(lián)中獲得性能提升,否
則不要將成員函數(shù)體放在類聲明中 。
所以您可以按照如下方式定義 getVolume 函數(shù):
class Box
{public:double length; // 長(zhǎng)度double breadth; // 寬度double height; // 高度double getVolume(void){return length * breadth * height;}
};
也可以在類的外部使用范圍解析運(yùn)算符 :: 定義該函數(shù),如下所示:
double Box::getVolume(void)
{return length * breadth * height;
}
在這里,需要強(qiáng)調(diào)一點(diǎn),在 :: 運(yùn)算符之前必須使用類名。調(diào)用成員函數(shù)是在對(duì)象上使用點(diǎn)運(yùn)算符 . ,這樣它就能操作與該對(duì)象相關(guān)的數(shù)據(jù),如下所示:
Box myBox; // 創(chuàng)建一個(gè)對(duì)象myBox.getVolume(); // 調(diào)用該對(duì)象的成員函數(shù)
使用上面提到的概念來(lái)設(shè)置和獲取類中不同的成員的值:
#include <iostream>
using namespace std;class Box
{public:double length;double width;double height;// 類成員函數(shù)聲明double getVolume(void);void setLength(double len);void setWidth(double wid);void setHeight(double hei);
};double Box::getVolume()
{return length * width * height;
}void Box::setHeight(double hei)
{height = hei;}void Box::setLength(double len)
{length = len;
}void Box::setWidth(double wid)
{width = wid;
}int main()
{Box box1; // box1,類型為 BoxBox box2;double volume = 0.0;box1.setLength(1);box1.setWidth(2);box1.setHeight(3);box2.setLength(4);box2.setWidth(5);box2.setHeight(6);volume = box1.getVolume();cout << "box1 vloume is " << volume << endl;volume = box2.getVolume();cout << "box2 vloume is " << volume << endl;return 0;
}
5. 類訪問(wèn)修飾符
數(shù)據(jù)封裝是面向?qū)ο缶幊痰囊粋€(gè)重要特點(diǎn),它防止函數(shù)直接訪問(wèn)類類型的內(nèi)部成員。類成員的訪問(wèn)限制是通過(guò)在類主體內(nèi)部對(duì)各個(gè)區(qū)域標(biāo)記 public 、 private 、 protected 來(lái)指定的。關(guān)鍵字 public 、 private 、 protected 稱為訪問(wèn)修飾符。
class Base {public:// 公有成員protected:// 受保護(hù)成員private:// 私有成員
};
一個(gè)類可以有多個(gè) public 、 protected 或 private 標(biāo)記區(qū)域。每個(gè)標(biāo)記區(qū)域在下一個(gè)標(biāo)記區(qū)域開(kāi)始之前或者在遇到類主體結(jié)束右括號(hào)之前都是有效的。
成員和類的默認(rèn)訪問(wèn)修飾符是 private 。也就是說(shuō)如下代碼
class X
{int func(int);
};
等價(jià)于
class X
{private:int func(int);
};
5.1 公有(public)成員
公有成員在程序中類的外部是可訪問(wèn)的。可以不使用任何成員函數(shù)來(lái)設(shè)置和獲取公有變量的值,如下所示:
#include <iostream>
using namespace std;class Line
{public:double length;void setLength(double len);double getLength(void);
};// 成員函數(shù)定義
double Line::getLength(void)
{return length;
}void Line::setLength(double len)
{length = len;
}// 程序的主函數(shù)
int main( )
{Line line;// 設(shè)置長(zhǎng)度line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl;// 不使用成員函數(shù)設(shè)置長(zhǎng)度line.length = 10.0; // OK: 因?yàn)?length 是公有的cout << "Length of line : " << line.length <<endl;return 0;
}
5.2 私有(private)成員
私有成員變量或函數(shù)在類的外部是不可訪問(wèn)的,甚至是不可查看的。只有類和友元函數(shù)可以訪問(wèn)私有成員。
默認(rèn)情況下,類的所有成員都是私有的。例如在下面的類中, width 是一個(gè)私有成員,這意味著,如果您沒(méi)有使用任何訪問(wèn)修飾符,類的成員將被假定為私有成員:
class Box
{double width;public:double length;void setWidth( double wid );double getWidth( void );
};
實(shí)際操作中,我們一般會(huì)在私有區(qū)域定義數(shù)據(jù),在公有區(qū)域定義相關(guān)的函數(shù),以便在類的外部也可以調(diào)用這些函數(shù),如下所示:
#include <iostream>
using namespace std;class Box
{public:double length;void setWidth(double wid);double getWidth(void);private:double width;
};// 成員函數(shù)定義
double Box::getWidth(void)
{return width ;
}void Box::setWidth(double wid)
{width = wid;
}// 程序的主函數(shù)
int main( )
{Box box;// 不使用成員函數(shù)設(shè)置長(zhǎng)度box.length = 10.0; // OK: 因?yàn)?length 是公有的cout << "Length of box : " << box.length <<endl;// 不使用成員函數(shù)設(shè)置寬度// box.width = 10.0; // Error: 因?yàn)?width 是私有的box.setWidth(10.0); // 使用成員函數(shù)設(shè)置寬度cout << "Width of box : " << box.getWidth() <<endl;return 0;
}
C++ 提供了一種很有用的簡(jiǎn)化功能 ,可用來(lái)描述沒(méi)有私有實(shí)現(xiàn)細(xì)節(jié)的類,這種語(yǔ)法功能就是結(jié)構(gòu)體 ( struct ),一個(gè)結(jié)構(gòu)體就是一個(gè)成員默認(rèn)為公有屬性的類 。
struct People
{int age;
};
等價(jià)于
class People
{public:int age;
};
結(jié)構(gòu)體主要用于成員可以取任意值的數(shù)據(jù)結(jié)構(gòu) 。
5.3 保護(hù)(protected)成員
保護(hù)成員變量或函數(shù)與私有成員十分相似,但有一點(diǎn)不同,保護(hù)成員在派生類(即子類)中是可訪問(wèn)的。
從下面的實(shí)例中,我們從父類 Box 派生了一個(gè)子類 smallBox。下面的實(shí)例與前面的實(shí)例類似,在這里 width 成員可被派生類 smallBox 的任何成員函數(shù)訪問(wèn)。
#include <iostream>
using namespace std;class Box
{protected:double width;
};class SmallBox:Box // SmallBox 是派生類
{public:void setSmallWidth( double wid );double getSmallWidth( void );
};// 子類的成員函數(shù)
double SmallBox::getSmallWidth(void)
{return width ;
}void SmallBox::setSmallWidth( double wid )
{width = wid;
}// 程序的主函數(shù)
int main( )
{SmallBox box;// 使用成員函數(shù)設(shè)置寬度box.setSmallWidth(5.0);cout << "Width of box : "<< box.getSmallWidth() << endl;return 0;
}
6. 類對(duì)象引用
我們說(shuō)引用就像是給變量起了一個(gè)別名,對(duì)這個(gè)引用的操作就和操作這個(gè)變量本身一樣。
對(duì)象也可以有引用,聲明一個(gè)對(duì)象的引用方法是:
類名 &對(duì)象名 a=對(duì)象名 b;
此時(shí),對(duì)對(duì)象 a 的訪問(wèn)和操作就如同對(duì)對(duì)象 b 的訪問(wèn)和操作一樣,對(duì)象 a 只是對(duì)象 b 的一個(gè)別名。
int main( )
{Box box; // 聲明一個(gè) box 對(duì)象Box &b = box; // 聲明一個(gè) box 引用b.setWidth(1.0); // 效果與 box.setWidth(1.0) 相同b.getWidth(); // 效果與 box.getWidth 相同return 0;
}
7. 類對(duì)象指針
由于類和結(jié)構(gòu)的相似性,對(duì)象指針和結(jié)構(gòu)指針的使用也是相似的。我們也是使用箭頭操作符 -> 來(lái)訪問(wèn)該指針?biāo)赶虻膶?duì)象的成員數(shù)據(jù)或成員函數(shù)。
int main( )
{Box box; // 聲明一個(gè) box 對(duì)象Box *b = &box; // 聲明一個(gè)對(duì)象指針b->setWidth(1.0); // 效果與 box.setWidth(1.0) 相同b->getWidth(); // 效果與 box.getWidth 相同return 0;
}
參考:
https://www.runoob.com/cplusplus/cpp-class-access-modifiers.html
總結(jié)
以上是生活随笔為你收集整理的C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《琴》是哪个时期的作品?
- 下一篇: 2022-2028年中国商贸物流行业市场