const在函数中也有很大的作用。
4.const修饰传入参数。
函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改该传入参数的值。同理,将对象指针参数或引用参数声明为const,函数将不修改由这个参数所指的对象。
例如:
#include <iostream> using namespace std; //void change(const ing &a)也是一样的 void change(const int *a)//修饰传入的指针类型参数或者是引用型参数 {//该函数体内不能修改*a的值 cout<<"in change() a="<<*a<<endl; *a=*a+10;//invalid } int main() { int i=10; int *p=&i; change(p); cout<<"in main() p="<<*p<<endl; }
编译结果:
5.修饰返回值的引用或者是修饰返回值为指针类型的指针
#include <iostream> using namespace std; const int& Max(const int &a,const int &b) {
//return a+5;//invalid if(a>b) return a; else return b; } int main() { int a=2; int b=5; int c; c=Max(a,b); cout<<c<<endl; }
//return a+5;//是不可行的,因为a+5实际上是一个临时的int变量。
6.类的成员函数中const的使用
1):作为修饰的传入参数效果和上面4是一样的。
2):修饰返回对象的引用与5原理也是一样的,而且更为重要。
3):在成员函数的最后加上const修饰代表该函数不修改任何该对象的成语属性。
例如:
#include <iostream> using namespace std; class A { private: int num; public: A(int i):num(i){ } void setNum(int i) { num=i; } int Max(const A &b)const //const代表该函数不改变该调用对象的任何成员函数 { //this->num+=10; //setNum(100); 也是不允许的,因为setNum()修改了该调用对象的num属性 if(this->num>b.num) return this->num; else return b.num; } }; int main() { A a(10); A b(5); int max=a.Max(b); cout<<max<<endl; }
需要注意的是,在用const修饰类的成员属性的时候,const只是代表了只读属性,而不是一个常量。
#include <iostream> using namespace std; class A { private: const int SIZE=5; int arr[SIZE];//这里会编译错误 };
还有一点就是,如果成员属性被const修饰,只能在声明的通过就进行初始化,或者是利用初始化器的方式初始化,而不能在构造函数体内初始化,这一点我会在以后的构造函数初始化内容里面说明。
——————————————————————————————————————————————————
//写的错误或者不好的地方请多多指导,可以在下面留言或者给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。
转载请注明出处:https://www.royalchen.com/
author:royalchen
Email:royalchen@royalchen.com
———————————————————————————————————————————————————