关于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的编辑页面有点儿~~~~~下次改进!)