面向对象day3:类和对象|封装的意义

本文介绍了面向对象编程中的封装概念,强调了封装将属性和行为整合以及权限控制的重要性。通过C++示例展示了如何创建类并实现封装,如设计圆类和学生类。封装有助于数据安全性,防止直接访问私有属性,并允许设定数据有效性检查。同时,讨论了struct和class的默认访问权限差异,以及如何通过设置私有属性来控制对外接口。
摘要由CSDN通过智能技术生成

面向对象day3:类和对象|封装的意义

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

例如:

  • 人可以作为对象,属性有年龄,性别,身高。体重…行为有走,跑,跳,吃饭…
  • 车也可以作为对象,属性有轮胎,方向盘,车灯…行为有载人,放音乐…
  • 具有相同性质的对象可以抽象为类,人属于人类,车属于车类.

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

下面是C++面向对象的特性封装:

1.封装的意义

  1. 将属性和行为作为一个整体,表现生活中的事物。
  2. 将属性和行为加以权限控制。

封装的意义一:
将属性和行为作为一个整体,表现生活中的事物。

语法:clsss 类名{访问权限:属性/行为};

示例1:设计一个圆类,计算圆的周长

#include<iostream>
using namespace std;
//设计一个圆类,计算圆的周长
//周长=2*pi*r
const double PI=3.14;
class Circle{
    //访问权限
public:
    //属性
    int m_r;
    //行为
    //获取圆的周长
    double calculateZC(){
        return 2*PI*m_r;
    }
};
int main()
{
    //通过圆类创建具体的圆对象:实例化
    Circle cl;
    //给圆对象的属性进行赋值
    cl.m_r=10;

    cout<<"圆的周长为:"<<cl.calculateZC()<<endl;
     
    return 0;
}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,也可以输出姓名和学号:

#include<iostream>
#include<string>
using namespace std;
//封装示例:创建一个学生类
class Student{
    //访问权限
    public://公共权限
//类中的属性和行为统称为成员
    //属性  成员属性 成员变量
    string m_name;
    string m_number;
    //行为 成员函数 成员方法  
    void showStudent(){
        cout<<"name:"<<m_name<<endl;
        cout<<"number:"<<m_number<<endl;
    }

    //通过行为给属性赋值
    void SetName(string name,string number){
        m_name=name;
        m_number=number;
    }
};
int main()
{
    //根据类创建一个对象  实例化对象
    Student s1;
    s1.m_name="zhangsan";
    s1.m_number="01";
    s1.showStudent();

    Student s2;
    s2.m_name="lisi";
    s2.m_number="02";
    s2.showStudent();

    Student s3;
    s3.SetName("wangwu","03");
    s3.showStudent();
    return 0;
}

封装的意义二:
将对象的属性和行为加以权限控制。

访问权限有三种:

  1. public 公共权限
  2. private 私有权限
  3. protected 保护权限
#include<iostream>
#include<string>
using namespace std;

//访问权限
/*
公共权限  public      成员类内可以访问类外也可以访问
保护权限  protected   成员类内可以访问类外不可以访问 儿子也可以访问父亲保护中的内容                               
私有权限  private     成员类内可以访问类外不可以访问 儿子不可以访问父亲私有的内容
*/ 


class Person{
    public: 
    string m_Name;

    protected:
    string m_Car;

    private:
    int m_Password;

    private:
    void func(){
        m_Name="zhangsan";
        m_Car="car1";
        m_Password=123;
    }


};
int main()
{
    Person p1;
    p1.m_Name="lisi"; 
    return 0;
}

2.struct和class的区别

在C++中struct也可用于声明一个类,它和class唯一的区别就是默认访问权限不同。

  • struct默认public
  • class默认private
#include<iostream>
using namespace std;
//C++中struct和class的区别

class C1{
    int m_num;//默认是私有权限
};

struct C2{
    int m_num;//默认是公共权限
};

int main()
{
    C1 c1;
    //c1.m_num;默认私有权限不可以访问
    C2 c2;
    c2.m_num=10;//默认公共权限
    return 0;
}

3.成员属性设置为私有

  1. 优点一:将成员属性设置为私有,加以读写权限的控制,可以设置外部接口进行访问。
  2. 优点二:对于写权限,我们可以检测数据的有效性。
#include<iostream>
#include<string>
using namespace std;
//成员属性设置为私有
class Person{
public:
    //设置姓名 提供公共的成员函数
    void setName(string name){
        m_Name=name;
    }
    //读取姓名
    string getName(){
        return m_Name;
    }

    int getAge(){
        m_Age=18;
        return m_Age;
    }

    void setNum(string num){
        m_Number=num;
    }

    private:
    //姓名 可读可写
    string m_Name;
    //年龄  只读
    int m_Age;
    //电话号码   只写
    string m_Number;
};
int main()
{

    Person p;
    p.setName("zhangsan");
    cout<<"姓名是"<<p.getName()<<endl;

    cout<<"年龄是"<<p.getAge()<<endl;
    //p.m_Age=20;只读

    p.setNum("123");
    //cout<<"电话号码是"<<p.m_Number<<endl;
    return 0;
}

检测数据的有效性:

#include<iostream>
#include<string>
using namespace std;
//成员属性设置为私有
class Person{
public:
    //设置姓名 提供公共的成员函数
    void setName(string name){
        m_Name=name;
    }
    //读取姓名
    string getName(){
        return m_Name;
    }

    void setAge(int age){
        if(age<0||age>150){
            m_Age=0;
            cout<<"输入有误!"<<endl;
            return;
        }
        m_Age=age;
    }

    int getAge(){
        //m_Age=18;
        return m_Age;
    }

    void setNum(string num){
        m_Number=num;
    }

    private:
    //姓名 可读可写
    string m_Name;
    //年龄  可读可写(0-100)用于检测数据有效性
    int m_Age;
    //电话号码   只写
    string m_Number;
};
int main()
{

    Person p;
    p.setName("zhangsan");
    cout<<"姓名是"<<p.getName()<<endl;

    p.setAge(160);//检测数据有效性

    cout<<"年龄是"<<p.getAge()<<endl;
    //p.m_Age=20;只读

    p.setNum("123");
    //cout<<"电话号码是"<<p.m_Number<<endl;
    return 0;
}

参考:黑马程序员

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值