首頁 > 軟體

C++深入分析講解類的知識點

2022-06-02 14:05:50

知識點引入

C語言中 資料 和 方法 是獨立:

//c語言的思想:資料  方法 分開
//人
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);
    // 出現一個問題(資料 方法獨立  容易造成 方法 呼叫錯誤資料)
    DogEat((Dog *)&person);
}

類的初識

1、封裝

把變數(屬性)和函數(操作)合成一個整體,封裝在一個類中

對變數和函數進行存取控制(公有、私有、保護)

類的封裝:將資料和方法封裝在一起 加以許可權區分 使用者只能通過公共方法 存取私有資料。

2、許可權

private私有 public公有 protected保護

private私有:類外部不可直接存取私有資料 類內部可以存取

protected保護:類外部不可直接存取私有資料 類內部可以存取

public公有:類外部可以存取私有資料 類內部可以存取

許可權只是針對 類的外部 , 類的內部 沒有許可權之分

class 類名{//抽象的概念  系統不會為其分配空間
    private://私有 類的外部 不可直接存取
    protected://保護 類的外部 不可直接存取
    資料
    public://公有 類的外部 可以直接存取
    方法
    //在類的內部 沒有許可權之分  都可以相互存取
};

案例:

class Person//抽象的概念
{//類的內部
private:
    int m_money;//私有資料
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 內的外部不可存取
    //cout<<"兄弟你的年齡:"<<lucy.m_age<<endl;//err 內的外部不可存取
    lucy.dese();//ok 公有的類的外部可用存取
    //private protected雖然是私有、保護的 類外不可存取 但是使用者可以藉助 public公有的方法
    //間接的存取私有、保護的資料
}

class預設是私有的 資料私有 方法公有 使用者就可以藉助 公有方法 間接的操作 私有資料

3、類的定義(定義型別)

關鍵字 class

#include <iostream>
using namespace std;
//類的定義:是不佔空間  只有用類範例化 物件的時候 系統為物件開闢空間
class Data
{
private://私有
//    int a=10;//err 定義類的時候 儘量不要 給成員賦值
    int a;//成員 資料
protected://保護
    int b;
public://公有
    int c;
    //成員函數
    void data_show(void)
    {
        //類的內部:沒有許可權區分 
        cout<<a<<", "<<b<<", "<<c<<endl;
    }
};
//類中的資料成員 擁有 獨立的空間
void test01()
{
    //使用Data範例化一個物件名為ob的物件
    Data ob;
    //成員資料依賴於物件的
    //cout<<" ob.a = "<<ob.a<<endl;//err a為私有 類外不能直接存取
    //cout<<" ob.b = "<<ob.b<<endl;//err b為保護 類外不能直接存取
    cout<<" ob.c = "<<ob.c<<endl;//err c為公有 類外可以直接存取
    //物件 通過公共方法 間接呼叫私用資料
    ob.data_show();
}
int main(int argc, char *argv[])
{
    test01();
    return 0;
}

4、類的成員函數與類中宣告及類外定義

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類的設計

設計一個Person型別

設計一個Person類,Person類具有name和age屬性,提供初始化函數(Init),並提供對name和age的 讀寫函數(set,get),但必須確保age的賦值在有效範圍內(0-100),超出有效範圍,則拒絕賦值,並提供 方法輸出姓名和年齡。

person.h:

#ifndef PERSON_H
#define PERSON_H
//類的標頭檔案:一般定義成員資料 宣告成員函數
class Person
{
private:
    char m_name[32];
    int m_age;
public:
    //初始化m_name m_age
    void init(char *name, int age);
    //設定name
    void setName(char *name);
    //獲取name
    char *getName(void);
    //設定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;
//定義類的成員函數
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;
}

設計立方體類

設計立方體類(Cube),求出立方體的面積( 2ab + 2ac + 2bc )和體積( a * b * c),分別用全域性函數和成員 函數判斷兩個立方體是否相等

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的關係

#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))//圓內
        {
            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<<"圓內"<<endl;
    }
    return 0;
}

到此這篇關於C++深入分析講解類的知識點的文章就介紹到這了,更多相關C++類別內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com