zoukankan      html  css  js  c++  java
  • 初始封装

    ----------------siwuxie095

       

       

       

       

       

       

       

       

    数据的封装

       

       

    学生 为例定义一个类:

       

    有两个数据成员:一个 string 型的姓名,一个 int 型的年龄

       

    通过对象直接访问数据成员的用法是有问题的,违背了面向对象的指导思想

       

       

       

       

    面向对象的基本思想

       

    面向对象的基本思想就是以对象为中心,具体来说就是要以 谁做什么 来表达程序的逻辑

       

       

    体现到代码层面就是将所有的 数据操作 转化为 成员函数的调用

       

    换句话说,对象在程序中的所有行为,都通过调用自己的函数来完成

       

       

       

    如:通过函数来封装数据成员

       

    数据成员定义在 private 下边,这里以 age 为例在 public 中定义两个成员函数

       

       

       

    直接用数据成员赋值的方法,虽然方便,但弊端很多,如:出现非法赋值

       

       

    而数据封装虽然看上去比较麻烦,但好处非常多,如:通过 数据封装 便能

    很好的解决像上面的非法赋值问题

       

    只需将 setAge() 略作改变,就能对传入进来的参数起到条件限制的作用

       

       

       

       

       

    此外,对于有些数据成员来说,只希望这些数据被外界读取,而不希望被外界改变

       

    只能读不能写

       

       

    以 汽车 为例定义一个类:

       

    private 下边的数据成员代表汽车轮子的个数

       

    对于汽车轮子的个数,不希望外界通过某一个函数去改变它的值,而只能读取它的值

       

    「只能读取不能写入的属性 只读属性」

       

       

       

       

       

    程序 1

       

    #include <stdlib.h>

    #include<iostream>

    #include <string>

    using namespace std;

       

    /**********************************************************/

    /* 数据的封装

    定义一个Student类,含有如下信息:

    1.姓名:name

    2.性别:gender

    3.学分(只读):score

    4.学习:study (学习可以增加学分)*/

    /**********************************************************/

       

    class Student

    {

    //一般将 public 写在前边,private 写在后边

    public:

    void setName(string _name)

    {

    m_strName = _name;

    }

    string getName()

    {

    return m_strName;

    }

    void setGender(string _gender)

    {

    m_strGender = _gender;

    }

    string getGender()

    {

    return m_strGender;

    }

    int getScore()

    {

    return m_iScore;

    }

    void initScore()//初始化学分

    {

    m_iScore = 0;

    }

    void study(int _score)

    {

    m_iScore += _score;

    }

    private:

    //数据成员的命名要求:m+下划线+数据类型+名字

    //命名的好处:每次看到它就知道它是定义在类中的数据成员

    string m_strName;

    string m_strGender;

    int m_iScore;

    };

       

    int main(void)

    {

    Student stu;

    stu.initScore();//如果不初始化 则会失控(值不确定)

    stu.setName("Marry");

    stu.setGender("");

    stu.study(5);//先修了5个学分

    stu.study(3);//再修了3个学分

    cout << stu.getName() << " " << stu.getGender() << " " << stu.getScore() << endl;

    system("pause");

    return 0;

    }

       

       

       

    程序 2:

       

    #include<stdlib.h>

    #include <iostream>

    #include <string>

    using namespace std;

       

    /**

    * 定义类:Student

    * 数据成员:m_strName

    * 数据成员的封装函数:setName()getName()

    */

    class Student

    {

    public:

    // 定义数据成员封装函数setName()

    void setName(string name)

    {

    m_strName = name;

    }

    // 定义数据成员封装函数getName()

    string getName()

    {

    return m_strName;

    }

    private:

    //定义Student类私有数据成员m_strName

    string m_strName;

    };

       

    int main()

    {

    // 使用new关键字,实例化对象(在堆中实例化对象)

    //也可以 Student *stu = new Student; 去掉括号

    Student *stu = new Student();

       

    if (NULL==stu)

    {

    system("pause");

    return 0;

    }

       

    // 设置对象的数据成员

    stu->setName("siwuxie095");

    // 使用cout打印对象str的数据成员

    cout << stu->getName() << endl;

       

    // 将对象str的内存释放,并将其置空

    delete stu;

    stu = NULL;

       

    system("pause");

    return 0;

    }

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    C# 通过反射初探ORM框架的实现原理
    Redis-Nosql数据库入门
    HTTPS 建立连接的详细过程
    Spring面试题
    struts2面试整理
    Java面试基本知识
    Spring MVC面试整理
    Mybatis面试整理
    Sublime 正则替换
    Hiberante知识点梳理
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6719135.html
Copyright © 2011-2022 走看看