日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

【学习笔记】C++ 核心编程(二)类和对象——封装

發(fā)布時(shí)間:2023/12/14 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【学习笔记】C++ 核心编程(二)类和对象——封装 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)容來(lái)自小破站《黑馬程序員C++》復(fù)習(xí)自用

【學(xué)習(xí)筆記】C++ 核心編程(二)類(lèi)和對(duì)象——封裝

  • 4 類(lèi)和對(duì)象
    • 4.1 封裝
      • 4.1.1 封裝的意義(一)
      • 4.1.1 封裝的意義(二)
      • 4.1.2 struct和class的區(qū)別
      • 4.1.3 成員屬性設(shè)置為私有
      • 4.1.4 封裝案例一: 設(shè)計(jì)立方體類(lèi)
      • 4.1.5 封裝案例二:點(diǎn)和圓的關(guān)系
      • 4.1.6 如何將點(diǎn)類(lèi)圓類(lèi)放到別的文件里,通過(guò)寫(xiě)聲明,寫(xiě)實(shí)現(xiàn)
    • 4.2 對(duì)象的初始化和清理(見(jiàn)后續(xù)更新...)
      • 4.2.1 構(gòu)造函數(shù)和析構(gòu)函數(shù)(見(jiàn)后續(xù)更新...)

4 類(lèi)和對(duì)象

C++面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)
C++認(rèn)為,萬(wàn)事萬(wàn)物皆為對(duì)象,對(duì)象上有其屬性和行為
例如:
人可以作為對(duì)象,屬性有姓名、年齡、身高、體重,行為有走、跑、唱歌、干飯;
車(chē)可以作為對(duì)象,屬性有輪胎、車(chē)燈、方向盤(pán),行為有載人、放音樂(lè)、飄逸;

具有相同性質(zhì)的對(duì)象,我們可以抽象的成為類(lèi),人屬于人類(lèi),車(chē)屬于車(chē)類(lèi)。

4.1 封裝

封裝是C++面向?qū)ο蟮娜筇匦灾弧?/p>

4.1.1 封裝的意義(一)

  • 將屬性和行為作為一個(gè)整體,表現(xiàn)生活中的事務(wù)
  • 將屬性和行為加以權(quán)限進(jìn)行控制
  • 語(yǔ)法:class 類(lèi)名{ 訪問(wèn)權(quán)限: 屬性 / 行為 };

    需求:設(shè)計(jì)一個(gè)圓類(lèi),求圓的周長(zhǎng)

    #include <iostream> using namespace std; //圓周率 const double PI = 3.14; //設(shè)計(jì)一個(gè)圓類(lèi),求圓的周長(zhǎng) //求圓的周長(zhǎng): 2*PI*半徑 //class代表要設(shè)計(jì)一個(gè)類(lèi),類(lèi)后邊緊跟著的就是類(lèi)名稱(chēng) class Circle {//訪問(wèn)權(quán)限//公共權(quán)限 public://屬性:半徑int m_r;//行為:獲取圓的周長(zhǎng)double calculateZC(){return 2 * PI * m_r;} }; int main() {//通過(guò)圓類(lèi),來(lái)創(chuàng)建具體的圓(對(duì)象)//實(shí)例化:通過(guò)一個(gè)類(lèi),創(chuàng)建一個(gè)對(duì)象的過(guò)程Circle c1;//Circle是類(lèi),c1是具體對(duì)象名字 //給圓對(duì)象的屬性進(jìn)行賦值c1.m_r = 10;cout << "圓的周長(zhǎng)為:" << c1.calculateZC() << endl;system("pause");return 0; }

    練習(xí)案例
    需求:設(shè)計(jì)一個(gè)學(xué)生類(lèi),屬性有姓名和學(xué)號(hào),可以給姓名和學(xué)號(hào)賦值,可以顯示學(xué)生的姓名和學(xué)號(hào)。

    #include <iostream> using namespace std; #include <string> //學(xué)生類(lèi) class student { public: //公共權(quán)限//屬性string m_name;//姓名int m_id;//學(xué)號(hào)//行為:顯示姓名學(xué)號(hào)void showStudent() {cout << "姓名:" << m_name << endl;cout << "學(xué)號(hào):" << m_id << endl;} }; int main() {//創(chuàng)建一個(gè)具體的學(xué)生(實(shí)例化對(duì)象)student s1;s1.m_name = "Siri";s1.m_id = 2025302040;//顯示學(xué)生信息s1.showStudent();system("pause");return 0; }

    除了這種賦值方式,還有一種,可以通過(guò)函數(shù)的行為來(lái)給姓名賦值。

    #include <iostream> using namespace std; #include <string> //學(xué)生類(lèi) class student { public: //公共權(quán)限//屬性string m_name;//姓名int m_id;//學(xué)號(hào)//給姓名賦值void setName(string name) {m_name = name;}void setID(int id) {m_id = id;}//行為:顯示姓名學(xué)號(hào)void showStudent() {cout << "姓名:" << m_name << endl;cout << "學(xué)號(hào):" << m_id << endl;} }; int main() {//創(chuàng)建一個(gè)具體的學(xué)生(實(shí)例化對(duì)象)student s1;s1.setName("Siri");s1.setID(2025302040);//顯示學(xué)生信息s1.showStudent();system("pause");return 0; }


    》》》專(zhuān)業(yè)術(shù)語(yǔ)擴(kuò)展:》》》

  • 類(lèi)中的屬性和行為,統(tǒng)一成為成員;
  • 屬性,也稱(chēng)成員屬性、成員變量;
  • 行為,也稱(chēng)成員函數(shù)、成員方法;
  • 4.1.1 封裝的意義(二)

    類(lèi)在設(shè)計(jì)的時(shí)候,可以把屬性和行為放在不同的權(quán)限下,加以控制,但是什么時(shí)候用什么權(quán)限
    訪問(wèn)權(quán)限有三種:

  • public 公共權(quán)限 類(lèi)內(nèi)可以訪問(wèn),類(lèi)外可以訪問(wèn)
  • protected 保護(hù)權(quán)限 類(lèi)內(nèi)可以訪問(wèn),類(lèi)外不可以訪問(wèn)(兒子也可以訪問(wèn)父親中的保護(hù)內(nèi)容)
  • private 私有權(quán)限 類(lèi)內(nèi)可以訪問(wèn),類(lèi)外不可以訪問(wèn)(兒子不可以訪問(wèn)父親中的私有內(nèi)容)
  • #include <iostream> using namespace std;class Persion { public: //公共權(quán)限string m_Name; //姓名 protected: //保護(hù)權(quán)限string m_Car; //汽車(chē) private:int m_Password; //銀行卡密碼public: //也可以用private:都屬于類(lèi)內(nèi),但是void func()也無(wú)法訪問(wèn)了void func(){m_Name = "張三";m_Car = "拖拉機(jī)";m_Password = 123456; //類(lèi)內(nèi)可以訪問(wèn)} }; int main() {//實(shí)例化一個(gè)具體的對(duì)象Persion p1;p1.m_Name = "里斯";p1.m_Car = "Benz"; //保護(hù)權(quán)限內(nèi)容,在類(lèi)外無(wú)法訪問(wèn)p1.m_Password = 222; //私有權(quán)限內(nèi)容,在類(lèi)外無(wú)法訪問(wèn)system("pause");return 0; }

    4.1.2 struct和class的區(qū)別

    在C++中struct和class唯一的區(qū)別就在于【默認(rèn)的訪問(wèn)權(quán)限不同】

  • struct 默認(rèn)權(quán)限為公共 (死抓科特)
  • class 默認(rèn)權(quán)限為私有 (克拉斯)
  • #include <iostream> using namespace std; class C1 //在上邊沒(méi)有寫(xiě)任何的public權(quán)限 {int m_A;//默認(rèn)權(quán)限 是 私有 }; struct C2 {int m_A;//默認(rèn)權(quán)限 是 公共 }; int main() {C1 c1;C2 c2;c1.m_A = 100;c2.m_A = 100;system("pause");return 0; }

    4.1.3 成員屬性設(shè)置為私有

    優(yōu)點(diǎn)1:將成員屬性設(shè)置為私有,可以自己控制讀寫(xiě)權(quán)限
    優(yōu)點(diǎn)2:對(duì)于讀寫(xiě)權(quán)限,我們可以檢測(cè)數(shù)據(jù)的有效性

    #include <iostream> using namespace std; //成員屬性設(shè)置為私有//設(shè)計(jì)人類(lèi) class Person { public://設(shè)置姓名(寫(xiě))void setName(string name) //相當(dāng)于提供類(lèi)一個(gè)公共成員函數(shù),側(cè)面給屬性進(jìn)行賦值{m_Name = name;}//獲取姓名(讀)string getName(){return m_Name;}//獲取年齡(只讀)int getAge(){m_Age = 0; //初始化0return m_Age;//(只讀狀態(tài))}// 設(shè)置情人(只寫(xiě))void setLover(string lover){m_Lover = lover;}private:string m_Name;int m_Age;string m_Lover; }; int main() {Person p;;p.setName("AA");cout << "姓名" << p.getName() << endl;//p.m_Age = 18;(錯(cuò))//p.setAge(18); (錯(cuò))cout << "年齡" << p.getAge() << endl;cout << "不可以修改年齡值,因?yàn)樵賞rivate私有權(quán)限下"<< endl << endl;//設(shè)置情人的名字p.setLover("BB");cout << "情人,可寫(xiě)不可讀" << endl;system("pause");return 0; }

    年齡可讀可寫(xiě):

    #include <iostream> using namespace std; //成員屬性設(shè)置為私有//設(shè)計(jì)人類(lèi) class Person { public://獲取年齡(可讀可寫(xiě)0-150歲)int getAge(){return m_Age;}//設(shè)置年齡,提供一個(gè)對(duì)外接口void setAge(int age){if (age < 0 || age >150){m_Age = 0;cout << "你這個(gè)老妖精" << endl;return;}m_Age = age;}private:int m_Age; }; int main() {Person p;p.setAge(1000);cout << "年齡" << p.getAge() << endl;system("pause");return 0; }

    4.1.4 封裝案例一: 設(shè)計(jì)立方體類(lèi)

  • 設(shè)計(jì)立方體類(lèi)(Cube)
  • 求出立方體的表面積和體積
  • 分別用 全局函數(shù) 和 成員函數(shù) 半段兩個(gè)立方體是否相等。
  • 創(chuàng)建第一個(gè)立方體:

    #include <iostream> using namespace std; //立方體類(lèi)設(shè)計(jì) // 1. 創(chuàng)建立方體類(lèi) // 2. 設(shè)計(jì)屬性 // 3. 設(shè)計(jì)行為 獲取立方體的面和和體積 class Cube { public://設(shè)置長(zhǎng)寬高void setL(int l) {m_L = l;}void setW(int w) {m_W = w;}void setH(int h) {m_H = h;}//獲取長(zhǎng)寬高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//獲取立方體的表面積和體積int calculateS(){return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;}int calculateV(){return m_L * m_W * m_H;}private:int m_L;int m_W;int m_H;//長(zhǎng)寬高 };int main() {//實(shí)例化一個(gè)立方體C1的對(duì)象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "calculateS = " << c1.calculateS() << endl << endl;cout << "calculateV = " << c1.calculateV() << endl << endl;system("pause");return 0; }

    利用全局函數(shù)判斷:

    #include <iostream> using namespace std;//立方體類(lèi)設(shè)計(jì) // 1. 創(chuàng)建立方體類(lèi) // 2. 設(shè)計(jì)屬性 // 3. 設(shè)計(jì)行為 獲取立方體的面和和體積 // 4. 分別利用全局函數(shù)和成員函數(shù),判斷兩個(gè)立方體是否相等 class Cube { public://設(shè)置長(zhǎng)寬高void setL(int l) {m_L = l;}void setW(int w) {m_W = w;}void setH(int h) {m_H = h;}//獲取長(zhǎng)寬高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//獲取立方體的表面積和體積int calculateS(){return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;}int calculateV(){return m_L * m_W * m_H;}private:int m_L;int m_W;int m_H;//長(zhǎng)寬高 };//利用全局函數(shù)判斷兩個(gè)立方體是否相等 bool isSame(Cube &c1, Cube &c2) //沒(méi)有&屬于值傳遞,值傳遞的時(shí)候會(huì)拷貝出來(lái)一份數(shù)據(jù)//為了方便,采用引用的方式,直接使用原始的數(shù)據(jù) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()){return true;}return false; } int main() {//實(shí)例化一個(gè)立方體C1的對(duì)象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "calculateS = " << c1.calculateS() << endl << endl;cout << "calculateV = " << c1.calculateV() << endl << endl;//創(chuàng)建第二個(gè)立方體Cube c2;c2.setL(10);c2.setW(10);c2.setH(10);bool ret = isSame(c1, c2);if (ret){cout << "c1 = c2" << endl;}else{cout << "c1 != c2" << endl << endl;}system("pause");return 0; }

    我們管class類(lèi)里邊的東西叫做成員,下面利用成員函數(shù)判斷:

    #include <iostream> using namespace std;//立方體類(lèi)設(shè)計(jì) // 1. 創(chuàng)建立方體類(lèi) // 2. 設(shè)計(jì)屬性 // 3. 設(shè)計(jì)行為 獲取立方體的面和和體積 // 4. 分別利用全局函數(shù)和成員函數(shù),判斷兩個(gè)立方體是否相等 class Cube { public://設(shè)置長(zhǎng)寬高void setL(int l) {m_L = l;}void setW(int w) {m_W = w;}void setH(int h) {m_H = h;}//獲取長(zhǎng)寬高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//獲取立方體的表面積和體積int calculateS(){return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;}int calculateV(){return m_L * m_W * m_H;}//利用成員函數(shù)判斷兩個(gè)立方體bool isSameByClass(Cube& c)//只需要傳一個(gè)立方體,然后拿另一個(gè)立方體來(lái)比較{if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()){return true;}return false;}private:int m_L;int m_W;int m_H;//長(zhǎng)寬高 };//利用全局函數(shù)判斷兩個(gè)立方體是否相等 bool isSame(Cube &c1, Cube &c2) //沒(méi)有&屬于值傳遞,值傳遞的時(shí)候會(huì)拷貝出來(lái)一份數(shù)據(jù)//為了方便,采用引用的方式,直接使用原始的數(shù)據(jù) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()){return true;}return false; } int main() {//實(shí)例化一個(gè)立方體C1的對(duì)象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "calculateS = " << c1.calculateS() << endl << endl;cout << "calculateV = " << c1.calculateV() << endl << endl;//創(chuàng)建第二個(gè)立方體Cube c2;c2.setL(10);c2.setW(10);c2.setH(11);//利用全局函數(shù)判斷bool ret = isSame(c1, c2);if (ret){cout << "全局函數(shù)判斷結(jié)果:c1 = c2" << endl;}else{cout << "全局函數(shù)判斷結(jié)果:c1 != c2" << endl << endl;}//利用成員函數(shù)判斷ret = c1.isSameByClass(c2);if (ret){cout << "成員函數(shù)判斷結(jié)果:c1 = c2" << endl;}else{cout << "成員函數(shù)判斷結(jié)果:c1 != c2" << endl << endl;}system("pause");return 0; }

    如果是全局函數(shù),要傳兩個(gè)立方體進(jìn)行對(duì)比,而成員函數(shù)只需要傳一個(gè)就好了。

    4.1.5 封裝案例二:點(diǎn)和圓的關(guān)系

    描述:設(shè)計(jì)一個(gè)圓形類(lèi)(Circle)和一個(gè)點(diǎn)類(lèi)(Point),計(jì)算點(diǎn)和圓的關(guān)系。

    點(diǎn)和圓的關(guān)系判斷:

    #include <iostream> using namespace std; //判斷點(diǎn)和圓的關(guān)系案例 //核心:在類(lèi)中,可以讓另一個(gè)類(lèi),作為本類(lèi)的成員 //點(diǎn)類(lèi),自定義的數(shù)據(jù)類(lèi)型 class Point { public: //對(duì)外提供公共接口void setX(int x) //設(shè)置 X 坐標(biāo){m_X = x;}int getX() //獲取 X 坐標(biāo){return m_X;}void setY(int y){m_Y = y;}int getY(){return m_Y;} private: //屬性:XY坐標(biāo)int m_X;int m_Y; }; //圓類(lèi) class Circle { public:void setR(int r) //設(shè)置半徑{m_R = r;}int getR(){return m_R;}void setCenter(Point center) //設(shè)置圓心{m_Center = center;}Point getCenter(){return m_Center;}private:int m_R;Point m_Center; //上去自己創(chuàng)建一個(gè)數(shù)據(jù)類(lèi)型,里邊包含XY坐標(biāo) };//判斷點(diǎn)和圓的關(guān)系 void isInCircle(Circle& c, Point& p) {//先計(jì)算兩點(diǎn)之間距離的平方int distance =(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());//計(jì)算半徑的平方int rDistance = c.getR() * c.getR();//判斷if (distance == rDistance){cout << "點(diǎn)在圓上" << endl;}else if (distance < rDistance){cout << "點(diǎn)在圓外" << endl;}else{cout << "點(diǎn)在圓內(nèi)" << endl;} }int main() {//創(chuàng)建一個(gè)圓Circle c;c.setR(10);Point center;center.setX(10);center.setY(0);c.setCenter(center);//創(chuàng)建一個(gè)點(diǎn)Point p;p.setX(10);p.setY(10);//判斷關(guān)系isInCircle(c, p);system("pause");return 0; }

    4.1.6 如何將點(diǎn)類(lèi)圓類(lèi)放到別的文件里,通過(guò)寫(xiě)聲明,寫(xiě)實(shí)現(xiàn)

    大量注釋

    Crtl + K + C

    首先我們創(chuàng)建兩個(gè)新文件,一個(gè).h頭文件,一個(gè).cpp源文件




    先在.h頭文件中先寫(xiě)以下內(nèi)容

    #pragma once //防止頭文件重復(fù)包含 # include<iostream> //標(biāo)準(zhǔn)的輸入輸出 using namespace std; //標(biāo)準(zhǔn)的命名空間

    然后把點(diǎn)類(lèi)內(nèi)容粘貼過(guò)來(lái)
    一般,在一個(gè)類(lèi)設(shè)計(jì)的時(shí)候,我們只需要聲明就可以了,把實(shí)現(xiàn)的都刪掉

    然后再聲明之后加一個(gè)分號(hào),以補(bǔ)全。即:

    #pragma once //防止頭文件重復(fù)包含 # include<iostream> //標(biāo)準(zhǔn)的輸入輸出 using namespace std; //標(biāo)準(zhǔn)的命名空間//點(diǎn)類(lèi),自定義的數(shù)據(jù)類(lèi)型 class Point //只留下函數(shù)的聲明和變量的聲明就可以了 { public: //對(duì)外提供公共接口void setX(int x); //設(shè)置 X 坐標(biāo)int getX(); //獲取 X 坐標(biāo)void setY(int y);int getY();private: //屬性:XY坐標(biāo)int m_X;int m_Y; };

    在.cpp源文件里邊:

    #include"point01.h" //先包含以下剛剛創(chuàng)建的.h頭文件

    然后把整個(gè)類(lèi)代碼再粘貼過(guò)來(lái)一次
    刪掉class,刪掉private:
    出現(xiàn)情況:

    因?yàn)楝F(xiàn)在寫(xiě)在這里,是一個(gè)全局函數(shù),但是我們的setX應(yīng)該是成員函數(shù),加上Point::,代表這是Point作用域下的函數(shù)
    寫(xiě)成:

    void Piont::setX(int x) {m_X = x; }

    整體縮進(jìn):

    Shift + Tab

    即:

    #include"point01.h" //先包含以下剛剛創(chuàng)建的.h頭文件 void Point::setX(int x) //設(shè)置 X 坐標(biāo) {m_X = x; } int Point::getX() //獲取 X 坐標(biāo) {return m_X; } void Point::setY(int y) {m_Y = y; } int Point::getY() {return m_Y; }

    這樣point拆分出來(lái)的份文件就寫(xiě)好了,在測(cè)試文件最上邊包含一下頭文件。

    #include"point01.h"

    最后測(cè)試代碼:

    #include <iostream> using namespace std; #include"point01.h" //圓類(lèi) class Circle { public:void setR(int r) //設(shè)置半徑{m_R = r;}int getR(){return m_R;}void setCenter(Point center) //設(shè)置圓心{m_Center = center;}Point getCenter(){return m_Center;}private: //核心,在類(lèi)中,可以讓另一個(gè)類(lèi),作為本類(lèi)的成員int m_R;Point m_Center; //上去自己創(chuàng)建一個(gè)數(shù)據(jù)類(lèi)型,里邊包含XY坐標(biāo) };//判斷點(diǎn)和圓的關(guān)系 void isInCircle(Circle& c, Point& p) {//先計(jì)算兩點(diǎn)之間距離的平方int distance =(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());//計(jì)算半徑的平方int rDistance = c.getR() * c.getR();//判斷if (distance == rDistance){cout << "點(diǎn)在圓上" << endl;}else if (distance < rDistance){cout << "點(diǎn)在圓外" << endl;}else{cout << "點(diǎn)在圓內(nèi)" << endl;} }int main() {//創(chuàng)建一個(gè)圓Circle c;c.setR(10);Point center;center.setX(10);center.setY(0);c.setCenter(center);//創(chuàng)建一個(gè)點(diǎn)Point p;p.setX(10);p.setY(10);//判斷關(guān)系isInCircle(c, p);system("pause");return 0; }

    4.2 對(duì)象的初始化和清理(見(jiàn)后續(xù)更新…)

    4.2.1 構(gòu)造函數(shù)和析構(gòu)函數(shù)(見(jiàn)后續(xù)更新…)

    總結(jié)

    以上是生活随笔為你收集整理的【学习笔记】C++ 核心编程(二)类和对象——封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。