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开辟空间
  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/loliconinvincible/p/12535515.html
Copyright © 2011-2022 走看看