C++:类和对象

2024-01-09 04:29:46

C++面向对象的三大特性为:封装、继承、多态

C++认为万事万物皆为对象,对象上有其属性和行为

例如:

人可以作为对象,属性有姓名、年龄、身高、体重…行为有唱、跳、跑…

车也可以作为对象,属性有轮胎、方向盘、大灯…行为有载人、放音乐、开空调…

具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类…

封装

封装的意义

封装是C++面向对象的三大特征之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物

  • 将属性和行为加以权限控制

封装的意义(一)

在设计类的时候,属性和行为写在一起,表现事物

class 类名{访问权限: 属性 / 行为};

示例:

示例1:创建一个圆类,求圆的周长

#include<iostream>
using namespace std;
double pi = 3.14;
//class 代表设计一个类,类后面紧跟着的就是类名称
class Circle
{
    //访问权限
    //公共权限
public:
    //属性 
    //半径
    int c_r;
    //行为
    //获取圆的周长
    double calculateZC()
    {
        return 2 * pi * c_r;
    }
};
int main(void)
{
    //通过圆类创建具体的圆(对象)
    //实例化——通过一个类创建一个对象的过程
    Circle c1;
    //给圆对象的属性进行赋值
    c1.c_r = 10;
    cout << "圆的周长为" << c1.calculateZC() << endl;
    return 0;
}

示例2:创建一个学生类

#include<iostream>
#include<string>
using namespace std;
class Student
{

public:
    string s_Name;
    int s_Id;
    void showStudent()
    {
        cout << "姓名: " << s_Name << "ID:" << s_Id << endl;
    }
    //赋值
    void inputName(string name)
    {
        s_Name = name;
    }
};

int main(void)
{
    Student s1;
    //s1.s_Name = "张三";
    s1.inputName("赵六");
    s1.s_Id = 123456;
    s1.showStudent();
    return 0;
}

类中的属性和行为,我们统称为成员

属性-成员属性-成员变量

行为-成员函数-成员方法

封装的意义(二)

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种

  1. public——公共权限——成员类内可以访问,类外可以访问

  2. protected–保护权限——成员类内可以访问,类外不可以访问

  3. private——私有权限——成员类内可以访问,类外不可以访问

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
    string p_name;
protected:
    string p_car;
private:
    int p_password;
public:
    void funcshow()
    {
        p_name = "张三";
        p_car = "拖拉机";
        p_password = 123456;
    }
};

int main(void)
{
    Person p1;
    p1.p_name = "王五";
    //p1.p_car = "GTR";protected类外无法访问
    //p1.p_password = 123;private类外无法访问
    return 0;
}

struct和class 在C++中struct和class的唯一区别就是默认的访问权限不同。

区别:

struct默认权限为公共public class默认权限为私有private 成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限。

优点2:对于写权限,我们可以检测数据的有效性。

示例:

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
    //设置姓名
    void setName(string name)
    {
        p_name = name;
    }
    //获取姓名
    string getName()
    {
        return p_name;
    }
    //获取年龄
    int getAge()
    {

        return p_age;
    }
    //设置年龄
    void setAge(int age)
    {

        p_age = age;
        if (age < 0 || age >150)
        {
            p_age = 0;
            cout << "什么鬼" << endl;
            return;
        }
    }
    //设置伙伴
    void setLover(string lname)
    {
        lover = lname;
    }
private:
    //姓名 可读可写
    string p_name;
    //年龄 可读可写加个范围
    int p_age;
    //伙伴  只写
    string lover;
};

int main(void)
{
    Person p1;
    p1.setName("张三");
    cout << "姓名:" << p1.getName() << endl;
    p1.setAge(18);
    cout << "年龄:" << p1.getAge() << endl;
    p1.setLover("赵四");
    return 0;
}

练习案例:

(1)设计立方体类

求立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等

#include<iostream>
using namespace std;
class Cube
{
public:

     void setl(int l)
     {
        C_L = l;
     }
     int getl()
     {
         return C_L;
     }

     void setw(int w)
     {
         C_W = w;
     }
     int getw()
     {
         return C_W;
     }

     void seth(int h)
     {
         C_H= h;
     }
     int geth()
     {
         return C_H;
     }

     //表面积
     int calculateS()
     {
         return 2 * C_L * C_W + 2 * C_L * C_H + 2 * C_W * C_H;
     }
     //体积
     int calculateV()
     {
         return C_L * C_W * C_H;
     }
     //成员函数判断是否相等
     bool issamebyClass(Cube &c)
     {                                                                  
         if (C_H== c.geth() && C_L == c.getl() && C_W == c.getw())
         {
             return true;
         }
         return false;
     }
private:
    int C_L;
    int C_W;
    int C_H;
};
//利用全局函数判断相等
bool issame(Cube &c1, Cube &c2)
{
    if (c1.geth() == c2.geth() && c1.getl() == c2.getl() && c1.getw() == c2.getw())
    {
        return true;
    }
    return false;
}
int main(void)
{
    Cube c1;
    c1.seth(10);
    c1.setl(10);
    c1.setw(10);
    cout << c1.calculateS() << endl;
    cout << c1.calculateV() << endl;

    Cube c2;
    c2.seth(10);
    c2.setl(10);
    c2.setw(10);
    //判断是否相等
    bool ret = issame(c1, c2);
    if (ret)
    {
        cout << "c1和c2相等" << endl;
    }
    else
    {
        cout << "c1和c2不相等" << endl;
    }
    //成员函数判断
    bool ret2 = c1.issamebyClass(c2); 
    if (ret2)
    {
        cout << "利用成员函数,c1和c2相等" << endl;
    }
    else
    {
        cout << "利用成员函数,c1和c2不相等" << endl;
    }
    system("pause");
    return 0;
}

文章来源:https://blog.csdn.net/Mr_dffan/article/details/131520210
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。