C++深入分析講解類的知識點(diǎn)
知識點(diǎn)引入
C語言中 數(shù)據(jù) 和 方法 是獨(dú)立:
//c語言的思想:數(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è)問題(數(shù)據(jù) 方法獨(dú)立 容易造成 方法 調(diào)用錯(cuò)誤數(shù)據(jù))
DogEat((Dog *)&person);
}
類的初識
1、封裝
把變量(屬性)和函數(shù)(操作)合成一個(gè)整體,封裝在一個(gè)類中
對變量和函數(shù)進(jìn)行訪問控制(公有、私有、保護(hù))
類的封裝:將數(shù)據(jù)和方法封裝在一起 加以權(quán)限區(qū)分 用戶只能通過公共方法 訪問私有數(shù)據(jù)。
2、權(quán)限
private私有 public公有 protected保護(hù)
private私有:類外部不可直接訪問私有數(shù)據(jù) 類內(nèi)部可以訪問
protected保護(hù):類外部不可直接訪問私有數(shù)據(jù) 類內(nèi)部可以訪問
public公有:類外部可以訪問私有數(shù)據(jù) 類內(nèi)部可以訪問
權(quán)限只是針對 類的外部 , 類的內(nèi)部 沒有權(quán)限之分
class 類名{//抽象的概念 系統(tǒng)不會為其分配空間
private://私有 類的外部 不可直接訪問
protected://保護(hù) 類的外部 不可直接訪問
數(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()
{
//用類 去 實(shí)例化 一個(gè)對象(就是用Person定義一個(gè)變量)
Person lucy;
//cout<<"兄弟你的錢:"<<lucy.m_money<<endl;//err 內(nèi)的外部不可訪問
//cout<<"兄弟你的年齡:"<<lucy.m_age<<endl;//err 內(nèi)的外部不可訪問
lucy.dese();//ok 公有的類的外部可用訪問
//private protected雖然是私有、保護(hù)的 類外不可訪問 但是用戶可以借助 public公有的方法
//間接的訪問私有、保護(hù)的數(shù)據(jù)
}class默認(rèn)是私有的 數(shù)據(jù)私有 方法公有 用戶就可以借助 公有方法 間接的操作 私有數(shù)據(jù)
3、類的定義(定義類型)
關(guān)鍵字 class
#include <iostream>
using namespace std;
//類的定義:是不占空間 只有用類實(shí)例化 對象的時(shí)候 系統(tǒng)為對象開辟空間
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)部:沒有權(quán)限區(qū)分
cout<<a<<", "<<b<<", "<<c<<endl;
}
};
//類中的數(shù)據(jù)成員 擁有 獨(dú)立的空間
void test01()
{
//使用Data實(shí)例化一個(gè)對象名為ob的對象
Data ob;
//成員數(shù)據(jù)依賴于對象的
//cout<<" ob.a = "<<ob.a<<endl;//err a為私有 類外不能直接訪問
//cout<<" ob.b = "<<ob.b<<endl;//err b為保護(hù) 類外不能直接訪問
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
{
//默認(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),并提供對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_Hperson.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_Hcube.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++深入分析講解類的知識點(diǎn)的文章就介紹到這了,更多相關(guān)C++類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Java C++ 題解leetcode1619刪除某些元素后數(shù)組均值
這篇文章主要為大家介紹了Java C++ 題解leetcode1619刪除某些元素后數(shù)組均值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)相機(jī)標(biāo)定板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
利用C語言實(shí)現(xiàn)一個(gè)最簡單的飛機(jī)游戲
在前面彈跳小球?的基礎(chǔ)上實(shí)現(xiàn)一個(gè)簡單的飛機(jī)游戲,主要包括飛機(jī)的顯示、控制移動(dòng)、顯示復(fù)雜圖案、發(fā)射激光、打靶練習(xí)等功能,感興趣的可以嘗試一下2022-10-10
C語言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)程序設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
如何運(yùn)用Capstone實(shí)現(xiàn)64位進(jìn)程鉤子掃描
本章將通過Capstone引擎實(shí)現(xiàn)64位進(jìn)程鉤子的掃描,讀者可使用此段代碼檢測目標(biāo)進(jìn)程內(nèi)是否被掛了鉤子,感興趣的朋友跟隨小編一起看看吧2024-08-08

