c++ const对象和const函数

关于const对象和const函数的分析

基本知识:

1.如果一个成员函数不对对象的任何成员数据的进行修改(最常见的为打印成员信息的函数),那么我们可以将这个成员函数设置为const函数,以保护对象数据。如void print()const    对成员函数()后加上const限定  如果在该函数里面修改对象的成员数据,则编译器就会报错。

2.const对象的成员数据(mutable 和const_cast<>()转换例外)的值是无法修改的,而一般的非const函数可以修改对象的成员数据的值,故而  对const 对象调用非const函数就会报错(额,对非const对象调用const函数当然是ok的)

如下代码所示

#include<iostream>

using namespace std;

class cat{
    
private:
    
    int age;
    
    int size;
    
public:
    
    cat(int age=0,int size=0):age(age),size(size){}
    
    //    void print()const{//const函数
    
    //        cout<<"i am const"<<endl;
    
    //        cout<<"age"<<age<<endl;
    
    //        cout<<"size"<<size<<endl;
    
    //    }
    
    void print(){
        
        cout<<"i am not const"<<endl;
        
        cout<<"age"<<age<<endl;
        
        cout<<"size"<<size<<endl;
        
    }
    
    //      void show()const{//作 测试对象成员数据 用
    
    //      cout<<"age"<<age<<endl;
    
    //      cout<<"size"<<size<<endl;
    
    
    
    
    
};

int main(){
    
    const cat zjc(1,1);
    
    cat liujiao(2,2);
    
    zjc.print();//报错
    
    liujiao.print();//ok
    
    return 0;
    
}

const 对象zjc对于调用zjc.print()报错   如下

Member function 'print' not viable: 'this' argument has type 'const cat', but function is not marked const

而非const对象liujiao.print()就是ok的

那么如何实现   对const zjc 的调用print  ???

方法一: 对print重载    由于const这个标识符也可以作为区分重载的标志(注意只有类的成员函数才有这个特殊的const限定)   故而当我们将上面的  void print()const的函数的注释撤销后

再次执行   就会有如下的执行结果

i am const

age1

size1

i am not const

age2

size2

可以看到他他对zjc 和 liujiao 分别调用了不同的print函数版本   -------这就是他们依照const实现的重载(const函数只是作为成员函数才有const ,注意友元函数和静态成员都没有没有)   当然你将 这个函数void print()抹掉    zjc 和liujiao 就调用 void print()const;这个函数

i am const

age1

size1

i am const

age2

size2

方法二: 用const_cast<>()方法将zjc转化为非const 调用 void print();

将main()函数改为如下

int main(){
    
    const cat zjc(1,1);
    
    cat liujiao(2,2);
    
    (const_cast<cat&>(zjc)).print();// 注意对zjc加()和在cat后加上引用
    
    liujiao.print();//ok
    
    return 0;
    
}

输出://发现他们都可以调用void print();

i am not const

age1

size1

i am not const

age2

size2

注意 const_cast传递的是一个自身的引用值 也就是说 他在const_cast<>()转化后再调用void print();是可以改变自己的成员数据

测试  在void print();函数的第一句将上 age = 1000;   再在main的最后调用zjc.show() 测试值是否发生改变

输出:结论const_cast<>转化后传入非const函数 可以改变const对象的值

i am not const

age1000

size1

i am not const

age1000

size2

age1000  //可以发现const zjc的age已经被修改

size1

第一次写博客,有点小紧张~~~希望得到大家的支持(当然刚写博客才发现这个blog的编辑页面有点儿~~~~~下次改进!)


 

猜你喜欢

转载自blog.csdn.net/zha_ojunchen/article/details/82561813