C++深入分析講解類的知識點
知識點引入
C語言中 數(shù)據(jù) 和 方法 是獨立:
//c語言的思想:數(shù)據(jù) 方法 分開 //人 typedef struct { char name[32]; int age; }Person; //動物 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={"旺財",6}; PersonEat(&person); DogEat(&dog); // 出現(xiàn)一個問題(數(shù)據(jù) 方法獨立 容易造成 方法 調(diào)用錯誤數(shù)據(jù)) DogEat((Dog *)&person); }
類的初識
1、封裝
把變量(屬性)和函數(shù)(操作)合成一個整體,封裝在一個類中
對變量和函數(shù)進行訪問控制(公有、私有、保護)
類的封裝:將數(shù)據(jù)和方法封裝在一起 加以權(quán)限區(qū)分 用戶只能通過公共方法 訪問私有數(shù)據(jù)。
2、權(quán)限
private私有 public公有 protected保護
private私有:類外部不可直接訪問私有數(shù)據(jù) 類內(nèi)部可以訪問
protected保護:類外部不可直接訪問私有數(shù)據(jù) 類內(nèi)部可以訪問
public公有:類外部可以訪問私有數(shù)據(jù) 類內(nèi)部可以訪問
權(quán)限只是針對 類的外部 , 類的內(nèi)部 沒有權(quán)限之分
class 類名{//抽象的概念 系統(tǒng)不會為其分配空間
private://私有 類的外部 不可直接訪問
protected://保護 類的外部 不可直接訪問
數(shù)據(jù)
public://公有 類的外部 可以直接訪問
方法
//在類的內(nèi)部 沒有權(quá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<<"萬美金 我就愛嘚瑟"<<endl; } }; void test01() { //用類 去 實例化 一個對象(就是用Person定義一個變量) Person lucy; //cout<<"兄弟你的錢:"<<lucy.m_money<<endl;//err 內(nèi)的外部不可訪問 //cout<<"兄弟你的年齡:"<<lucy.m_age<<endl;//err 內(nèi)的外部不可訪問 lucy.dese();//ok 公有的類的外部可用訪問 //private protected雖然是私有、保護的 類外不可訪問 但是用戶可以借助 public公有的方法 //間接的訪問私有、保護的數(shù)據(jù) }
class默認是私有的 數(shù)據(jù)私有 方法公有 用戶就可以借助 公有方法 間接的操作 私有數(shù)據(jù)
3、類的定義(定義類型)
關(guān)鍵字 class
#include <iostream> using namespace std; //類的定義:是不占空間 只有用類實例化 對象的時候 系統(tǒng)為對象開辟空間 class Data { private://私有 // int a=10;//err 定義類的時候 盡量不要 給成員賦值 int a;//成員 數(shù)據(jù) protected://保護 int b; public://公有 int c; //成員函數(shù) void data_show(void) { //類的內(nèi)部:沒有權(quán)限區(qū)分 cout<<a<<", "<<b<<", "<<c<<endl; } }; //類中的數(shù)據(jù)成員 擁有 獨立的空間 void test01() { //使用Data實例化一個對象名為ob的對象 Data ob; //成員數(shù)據(jù)依賴于對象的 //cout<<" ob.a = "<<ob.a<<endl;//err a為私有 類外不能直接訪問 //cout<<" ob.b = "<<ob.b<<endl;//err b為保護 類外不能直接訪問 cout<<" ob.c = "<<ob.c<<endl;//err c為公有 類外可以直接訪問 //對象 通過公共方法 間接調(diào)用私用數(shù)據(jù) ob.data_show(); } int main(int argc, char *argv[]) { test01(); return 0; }
4、類的成員函數(shù)與類中聲明及類外定義
class Data2 { //默認為私有 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è)計
設(shè)計一個Person類型
設(shè)計一個Person類,Person類具有name和age屬性,提供初始化函數(shù)(Init),并提供對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è)計立方體類
設(shè)計立方體類(Cube),求出立方體的面積( 2ab + 2ac + 2bc )和體積( a * b * c),分別用全局函數(shù)和成員 函數(shù)判斷兩個立方體是否相等
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; }
點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++深入分析講解類的知識點的文章就介紹到這了,更多相關(guān)C++類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)樹的雙親表示法實例詳解
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)樹的雙親表示法實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++實現(xiàn)ETW進行進程變動監(jiān)控詳解
ETW提供了一種對用戶層應(yīng)用程序和內(nèi)核層驅(qū)動創(chuàng)建的事件對象的跟蹤記錄機制。為開發(fā)者提供了一套快速、可靠、通用的一系列事件跟蹤特性。本文將利用ETW進行進程變動監(jiān)控,需要的可以參考一下2022-07-07C語言實現(xiàn)十六進制轉(zhuǎn)換為十進制的方法詳解
這篇文章主要為大家詳細介紹了C語言實現(xiàn)十六進制轉(zhuǎn)換為十進制的方法,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下2022-11-11C語言FlappyBird飛揚的小鳥實現(xiàn)開發(fā)流程
因為在家宅了好多天,隨手玩了下自己以前做的一些小游戲,說真的,有幾個游戲做的是真的劣質(zhì),譬如 flappybird 真的讓我難以忍受,于是重做了一波分享給大家2022-11-11