zoukankan      html  css  js  c++  java
  • C++ 类(const修饰普通成员函数)

    const修饰普通成员函数

    我们知道this指针指向的是具体的对象,普通的成员函数存在(加深记忆),设计this指针的时候格式为*const this(常量指针)。

    const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当const修饰类的成员函数时,成员函数有什么特点。

    类的成员函数后面加 const ,表面这个函数不会对这个类对象的数据成员(准确的说是非静态数据成员)作任何改变。

    在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加const,而对于改变数据成员的成员函数不能加const。所以const关键字对成员函数的行为作了更加明确的限定:

    1.有const修饰的成员(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;

    2.在类的成员函数后面加 const 还有什么好处,那就是常量(即const)对象可以调用const成员函数,而不能调用非const 成员函数。

    1 int myFun(void) const //const修饰的是成员函数
    2 {}//函数内部不能修改 普通成员变量  mutable修饰时例外
     1 class Data
     2 {
     3 private:
     4     int data;
     5     
     6     mutable int num;
     7 public:
     8     //遍历 成员的函数 不会去修改成员的值
     9     //如果函数不会更改成员数据 就让编译器知道 这是一个const函数
    10     void myPrintData(void) const 
    11     {
    12         //data =10000;//err const修饰函数 函数不能操作普通成员变量
    13         cout<<this->data<<endl;
    14         //cout<<data<<endl;
    15 
    16         //mutable修饰的成员变量 可以修改
    17         num = 200;
    18     }
    19     
    20     Data()
    21     {
    22         cout<<"无参构造"<<endl;
    23     }
    24     Data(int data)
    25     {
    26         this->data =data;
    27         cout<<"有参构造"<<endl;
    28     }
    29     Data(const Data &ob)
    30     {
    31         this->data = ob.data;
    32         cout<<"拷贝构造"<<endl;
    33     }
    34     ~Data()
    35     {
    36         cout<<"析构函数"<<endl;
    37     }
    38 };
    39 void test02()
    40 {
    41     Data ob1(100);
    42     ob1.myPrintData();
    43 }

    2、const修饰对象 叫常对象

    class Data
    {
    private:
        int data;
    
        mutable int num;
    public:
        //遍历 成员的函数 不会去修改成员的值
        //如果函数不会更改成员数据 就让编译器知道 这是一个const函数
        void myPrintData(void) const
        {
            //data =10000;//err const修饰函数 函数不能操作普通成员变量
            cout<<this->data<<endl;
            //cout<<data<<endl;
    
            //mutable修饰的成员变量 可以修改
            num = 200;
        }
    
        //编译器认为 普通成员函数 存在修改成员变量 可能
        void setData(int data) const
        {
            //this->data = data;
            return;
        }
        Data()
        {
            cout<<"无参构造"<<endl;
        }
        Data(int data)
        {
            this->data =data;
            cout<<"有参构造"<<endl;
        }
        Data(const Data &ob)
        {
            this->data = ob.data;
            cout<<"拷贝构造"<<endl;
        }
        ~Data()
        {
            cout<<"析构函数"<<endl;
        }
    };
    void test03()
    {
        //常对象
        const Data ob1(200);
    
        //常对象 只能调用const修饰的函数 遍历成员数据
        ob1.setData(20000);
    
        ob1.myPrintData();
    }

    总结:

    1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

    2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员

    3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

    4)如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。

    const int num = 10;//系统不会给num开辟空间 num被放入符号表中 如果后期对&num 这时系统才会给num开辟空间
  • 相关阅读:
    字符串常见考题
    二叉树的按行层序遍历及序列化和反序列化
    二叉搜索应用(2)
    Kubernetes-存活探针(liveness probe)
    Kubernetes-ReplicationController(RC)
    Kubernetes-ReplicaSet(RS)
    Kubernetes-DaemonSet
    Kubernetes-PersistentVolume(PV)介绍
    centos7.x 通过yum方式安装java jdk1.8.0
    Kubernetes-卷/存储卷(emptyDir/hostPath/pv/pvc)
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/12535515.html
Copyright © 2011-2022 走看看