C++深入分析講解類的知識(shí)點(diǎn)
知識(shí)點(diǎn)引入
C語(yǔ)言中 數(shù)據(jù) 和 方法 是獨(dú)立:
//c語(yǔ)言的思想:數(shù)據(jù) 方法 分開 //人 typedef struct { char name[32]; int age; }Person; //動(dòng)物 typedef struct { char name[32]; int age; int type; }Dog; void PersonEat(Person *p) { cout<<p->name<<"正在吃飯"<<endl; } void DogEat(Dog *d) { cout<<d->name<<"正在吃狗糧, 汪汪"<<endl; } void test01() { Person person = {"老王",43}; Dog dog={"旺財(cái)",6}; PersonEat(&person); DogEat(&dog); // 出現(xiàn)一個(gè)問(wèn)題(數(shù)據(jù) 方法獨(dú)立 容易造成 方法 調(diào)用錯(cuò)誤數(shù)據(jù)) DogEat((Dog *)&person); }
類的初識(shí)
1、封裝
把變量(屬性)和函數(shù)(操作)合成一個(gè)整體,封裝在一個(gè)類中
對(duì)變量和函數(shù)進(jìn)行訪問(wèn)控制(公有、私有、保護(hù))
類的封裝:將數(shù)據(jù)和方法封裝在一起 加以權(quán)限區(qū)分 用戶只能通過(guò)公共方法 訪問(wèn)私有數(shù)據(jù)。
2、權(quán)限
private私有 public公有 protected保護(hù)
private私有:類外部不可直接訪問(wèn)私有數(shù)據(jù) 類內(nèi)部可以訪問(wèn)
protected保護(hù):類外部不可直接訪問(wèn)私有數(shù)據(jù) 類內(nèi)部可以訪問(wèn)
public公有:類外部可以訪問(wèn)私有數(shù)據(jù) 類內(nèi)部可以訪問(wèn)
權(quán)限只是針對(duì) 類的外部 , 類的內(nèi)部 沒(méi)有權(quán)限之分
class 類名{//抽象的概念 系統(tǒng)不會(huì)為其分配空間
private://私有 類的外部 不可直接訪問(wèn)
protected://保護(hù) 類的外部 不可直接訪問(wèn)
數(shù)據(jù)
public://公有 類的外部 可以直接訪問(wèn)
方法
//在類的內(nèi)部 沒(méi)有權(quán)限之分 都可以相互訪問(wèn)
};
案例:
class Person//抽象的概念 {//類的內(nèi)部 private: int m_money;//私有數(shù)據(jù) protected: int m_age; public: void dese() { m_money = 100; m_age = 18; cout<<"我有房 有車 又年輕"<<m_age<<"歲又有錢"<<m_money<<"萬(wàn)美金 我就愛嘚瑟"<<endl; } }; void test01() { //用類 去 實(shí)例化 一個(gè)對(duì)象(就是用Person定義一個(gè)變量) Person lucy; //cout<<"兄弟你的錢:"<<lucy.m_money<<endl;//err 內(nèi)的外部不可訪問(wèn) //cout<<"兄弟你的年齡:"<<lucy.m_age<<endl;//err 內(nèi)的外部不可訪問(wèn) lucy.dese();//ok 公有的類的外部可用訪問(wèn) //private protected雖然是私有、保護(hù)的 類外不可訪問(wèn) 但是用戶可以借助 public公有的方法 //間接的訪問(wèn)私有、保護(hù)的數(shù)據(jù) }
class默認(rèn)是私有的 數(shù)據(jù)私有 方法公有 用戶就可以借助 公有方法 間接的操作 私有數(shù)據(jù)
3、類的定義(定義類型)
關(guān)鍵字 class
#include <iostream> using namespace std; //類的定義:是不占空間 只有用類實(shí)例化 對(duì)象的時(shí)候 系統(tǒng)為對(duì)象開辟空間 class Data { private://私有 // int a=10;//err 定義類的時(shí)候 盡量不要 給成員賦值 int a;//成員 數(shù)據(jù) protected://保護(hù) int b; public://公有 int c; //成員函數(shù) void data_show(void) { //類的內(nèi)部:沒(méi)有權(quán)限區(qū)分 cout<<a<<", "<<b<<", "<<c<<endl; } }; //類中的數(shù)據(jù)成員 擁有 獨(dú)立的空間 void test01() { //使用Data實(shí)例化一個(gè)對(duì)象名為ob的對(duì)象 Data ob; //成員數(shù)據(jù)依賴于對(duì)象的 //cout<<" ob.a = "<<ob.a<<endl;//err a為私有 類外不能直接訪問(wèn) //cout<<" ob.b = "<<ob.b<<endl;//err b為保護(hù) 類外不能直接訪問(wèn) cout<<" ob.c = "<<ob.c<<endl;//err c為公有 類外可以直接訪問(wèn) //對(duì)象 通過(guò)公共方法 間接調(diào)用私用數(shù)據(jù) ob.data_show(); } int main(int argc, char *argv[]) { test01(); return 0; }
4、類的成員函數(shù)與類中聲明及類外定義
class Data2 { //默認(rèn)為私有 int a; public: //類中聲明 類外定義 void setA(int v); int getA(void); }; void Data2::setA(int v) { a = v; return; } int Data2::getA() { return a; } void test02() { Data2 ob; ob.setA(100); cout<<"a = "<<ob.getA()<<endl; }
Person類的設(shè)計(jì)
設(shè)計(jì)一個(gè)Person類型
設(shè)計(jì)一個(gè)Person類,Person類具有name和age屬性,提供初始化函數(shù)(Init),并提供對(duì)name和age的 讀寫函數(shù)(set,get),但必須確保age的賦值在有效范圍內(nèi)(0-100),超出有效范圍,則拒絕賦值,并提供 方法輸出姓名和年齡。
person.h:
#ifndef PERSON_H #define PERSON_H //類的頭文件:一般定義成員數(shù)據(jù) 聲明成員函數(shù) class Person { private: char m_name[32]; int m_age; public: //初始化m_name m_age void init(char *name, int age); //設(shè)置name void setName(char *name); //獲取name char *getName(void); //設(shè)置age void setAge(int age); //獲取age int getAge(void); //顯示m_name m_age void showPerons(void); }; #endif // PERSON_H
person.cpp:
#include "person.h" //#include <string.h> #include<cstring> #include<iostream> using namespace std; //定義類的成員函數(shù) void Person::init(char *name, int age) { strcpy(m_name, name); if(age>=0 && age<=100) { m_age = age; } else { cout<<"年齡輸入非法"<<endl; } } void Person::setName(char *name) { strcpy(m_name, name); return; } char *Person::getName() { return m_name; } void Person::setAge(int age) { if(age>=0 && age<=100) { m_age = age; } else { cout<<"年齡輸入非法"<<endl; } return; } int Person::getAge() { return m_age; } void Person::showPerons() { cout<<"姓名:"<<m_name<<", 年齡:"<<m_age<<endl; return; }
main.cpp
#include <iostream> #include "person.h" using namespace std; int main(int argc, char *argv[]) { Person ob; ob.init("lucy", 18); ob.showPerons(); ob.setName("bob"); cout<<"姓名:"<<ob.getName()<<endl; ob.setAge(19); cout<<"年齡:"<<ob.getAge()<<endl; return 0; }
設(shè)計(jì)立方體類
設(shè)計(jì)立方體類(Cube),求出立方體的面積( 2ab + 2ac + 2bc )和體積( a * b * c),分別用全局函數(shù)和成員 函數(shù)判斷兩個(gè)立方體是否相等
cube.h
#ifndef CUBE_H #define CUBE_H class Cube { private: int m_l; int m_w; int m_h; public: void setL(int l); int getL(void); void setW(int w); int getW(void); void setH(int h); int getH(void); int getS(void); int getV(void); bool compareCube(Cube &ob); }; #endif // CUBE_H
cube.cpp
#include "cube.h" void Cube::setL(int l) { m_l = l; return; } int Cube::getL() { return m_l; } void Cube::setW(int w) { m_w = w; return; } int Cube::getW() { return m_w; } void Cube::setH(int h) { m_h = h; return; } int Cube::getH() { return m_h; } int Cube::getS() { return (m_l*m_w+m_w*m_h+m_l*m_h)*2; } int Cube::getV() { return m_l*m_w*m_h; } bool Cube::compareCube(Cube &ob) { if((m_l==ob.m_l) &&( m_w==ob.m_w) &&(m_h == ob.m_h)) return true; else return false; }
main.cpp
#include <iostream> #include "cube.h" using namespace std; bool myCompareCube(Cube &ob1, Cube &ob2) { if((ob1.getL() == ob2.getL()) && \ (ob1.getW() == ob2.getW()) &&(ob1.getH() == ob2.getH())) { return true; } else return false; } int main(int argc, char *argv[]) { Cube ob1; ob1.setL(10); ob1.setW(10); ob1.setH(10); cout<<"面積為:"<<ob1.getS()<<endl; cout<<"體積為:"<<ob1.getV()<<endl; Cube ob2; ob2.setL(10); ob2.setW(20); ob2.setH(10); if(ob1.compareCube(ob2) == true) { cout<<"相等"<<endl; } else { cout<<"不相等"<<endl; } if(myCompareCube(ob1, ob2) == true) { cout<<"相等"<<endl; } else { cout<<"不相等"<<endl; } return 0; }
點(diǎn)Point和圓Circle的關(guān)系
#include <iostream> using namespace std; class Point { private: int m_x; int m_y; public: void setX(int x) { m_x = x; } int getX(void) { return m_x; } void setY(int y) { m_y = y; } int getY(void) { return m_y; } }; class Circle { private: Point m_p; int m_r; public: void setPoint(int x, int y) { m_p.setX(x); m_p.setY(y); } void setR(int r) { m_r = r; } int getR(void) { return m_r; } int PointIsOnCircle(Point &p) { int tmp_x = (m_p.getX()-p.getX())*(m_p.getX()-p.getX()); int tmp_y = (m_p.getY()-p.getY())*(m_p.getY()-p.getY()); if((tmp_x+tmp_y) > (m_r*m_r))//圓外 { return 1; } else if((tmp_x+tmp_y) == (m_r*m_r))//圓上 { return 0; } else if((tmp_x+tmp_y) < (m_r*m_r))//圓內(nèi) { return -1; } } }; int main(int argc, char *argv[]) { Point p1; p1.setX(5); p1.setY(5); Circle c1; c1.setPoint(2,2); c1.setR(5); int ret = c1.PointIsOnCircle(p1); if( ret== 0) { cout<<"圓上"<<endl; } else if(ret == 1) { cout<<"圓外"<<endl; } else if(ret == -1) { cout<<"圓內(nèi)"<<endl; } return 0; }
到此這篇關(guān)于C++深入分析講解類的知識(shí)點(diǎn)的文章就介紹到這了,更多相關(guān)C++類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹的雙親表示法實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹的雙親表示法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++實(shí)現(xiàn)ETW進(jìn)行進(jìn)程變動(dòng)監(jiān)控詳解
ETW提供了一種對(duì)用戶層應(yīng)用程序和內(nèi)核層驅(qū)動(dòng)創(chuàng)建的事件對(duì)象的跟蹤記錄機(jī)制。為開發(fā)者提供了一套快速、可靠、通用的一系列事件跟蹤特性。本文將利用ETW進(jìn)行進(jìn)程變動(dòng)監(jiān)控,需要的可以參考一下2022-07-07C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn)
本文主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08C語(yǔ)言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11C語(yǔ)言FlappyBird飛揚(yáng)的小鳥實(shí)現(xiàn)開發(fā)流程
因?yàn)樵诩艺撕枚嗵?,隨手玩了下自己以前做的一些小游戲,說(shuō)真的,有幾個(gè)游戲做的是真的劣質(zhì),譬如 flappybird 真的讓我難以忍受,于是重做了一波分享給大家2022-11-11詳解C語(yǔ)言的隨機(jī)數(shù)生成及其相關(guān)題目
這篇文章主要介紹了詳解C語(yǔ)言的隨機(jī)數(shù)生成及其相關(guān)題目,作者還列舉了阿里巴巴的一道相關(guān)的面試題,需要的朋友可以參考下2015-08-08