C++学习笔记8,const在函数方面的使用(二)


 

 

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修饰,只能在声明的通过就进行初始化,或者是利用初始化器的方式初始化,而不能在构造函数体内初始化,这一点我会在以后的构造函数初始化内容里面说明。

    

     

 

 


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注