zoukankan      html  css  js  c++  java
  • C++类和对象之数据域封装

    数据域封装

    先放一段之前的类定义代码。

    #ifndef CIRCLE_H
    #define CIRCLE_H
    
    class Circle {
    public:
        //圆的半径
        double radius;
        
        //无参构造函数
        Circle();
        
        //有参构造函数
        Circle(double);
        
        //获取圆的面积
        double getArea();
    };
    
    #endif

    之前我们把所有的数据域和函数都放在了public之后。public的意思是公开的,也就是说,谁都可以访问这些数据和函数。

    比如想要修改圆一个圆对象c1的半径,那么可以通过直接访问radius来修改

    c1.radius = 2;

    但是这样的风格并不好。具体表现在:

    • 数据可能被搞乱。假如一个函数要使用类的一个属性。但是这个不被封装的属性可以被修改。这样可能会导致函数执行出不同的结果。
    • 不易于维护。圆的半径一定是大于0的,但是如果数据不被封装,可以直接修改的话,我们就无法满足这个条件。

    我们应该把我们的数据封装起来,而函数则一般不封装。

    代表封装的关键字是private(私有的),做法同public类似。私有数据或函数只有在类内部可以访问,如果这时候再直接访问,编译器会报错。见下面的代码:

    #ifndef CIRCLE_H
    #define CIRCLE_H
    
    class Circle {
    private:
        //圆的半径
        double radius;
    
    public:
        //无参构造函数
        Circle();
        
        //有参构造函数
        Circle(double);
        
        //获取圆的面积
        double getArea();
    
        //获取圆的半径
        double getRadius();
    
        //设置圆的半径,同时判断是否大于0
        void setRadius(double newRadius);
    };
    
    #endif

    在上面的代码中,我们把数据半径封装,而且提供了getter和setter方法,也就是getRadius()和setRadius(double newRadius)。这两个方法分别负责获取和修改数据,而且命名方式一般都是getXxx()和setXxx(),用首字母大写来区分两个单词。

    getter方法就像是一个访问器,而setter则像是一个更改器。

    并不是说所有的数据都需要getter和setter方法,这要视情况而定。

    变量作用域

    一个程序的变量大体可分为两种类型:全局变量,局部变量。

    局部变量是在函数内作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量编译器会报错。
    全局变量是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。

    关于变量作用域,可以参考这篇博客:

    全局变量、局部变量、静态全局变量、静态局部变量的区别

    类中的变量也符合这些规则。

    特别注意的是,如果一个数据域或者函数被声明为static(即静态数据或函数),则这个数据或函数不属于某个具体的对象实例,而是属于这个类。因此,所有的对象的static数据都是一样的。

  • 相关阅读:
    240 Search a 2D Matrix II 搜索二维矩阵 II
    239 Sliding Window Maximum 滑动窗口最大值
    bzoj5029: 贴小广告&&bzoj5168: [HAOI2014]贴海报
    bzoj5178: [Jsoi2011]棒棒糖
    bzoj5293: [Bjoi2018]求和
    bzoj5194: [Usaco2018 Feb]Snow Boots
    bzoj2007: [Noi2010]海拔
    bzoj4956: [Wf2017]Secret Chamber at Mount Rushmore
    bzoj3296: [USACO2011 Open] Learning Languages
    bzoj4887: [Tjoi2017]可乐
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12686831.html
Copyright © 2011-2022 走看看