const&与const

学习C++已经将近一年,在这期间也遇到过各种问题,零零散散地记录,但后面内容多了找起来很麻烦,萌生用博客记录的想法,也希望对看到这些的人有所帮助。
楼主现在大四,在此之前只是大一上过一学期的C++课程,上学期开始进入课题组进行学习,导师所做方向为软件的二次开发,学生研究生阶段基本是写代码(C++语言)。
在刚进入课题组时,实验室师兄前期是让我们写一些基本的类,白天学软件,晚上写代码然后第二天早上给他修改,对于刚步入C++的楼主来说真是太痛苦了。
刚开始最多的问题就是const及其引用(const&),成员函数里面的形参基本都让使用const引用形式,对此,一方面不理解为什么这么做;另一方面,简单添加"const&"之后,编译开始出现各种问题,疯狂查阅资料后,算是有个一知半解。
(1)为什么使用const
防止修饰的变量被修改,刚接触这一点时,还是有点懵的。都const修饰了,怎么可能被修改?
对,修饰了就不会被修改了,可能万一你忘了这个变量不能修改从而对其进行了修改呢?这时const的作用就体现了,编译器就会告诉你修改了不应该修改的变量。
(2)const引用的一些规则
对于const引用,主要使用在函数的参数传递中。
当实参为常量,形参的引用也必须为常量引用;
当形参为常量引用时,实参可以是变量、常量或者常数;
普通引用作为形参时,实参必须为变量;

//fun1
int fun1(const int& a)
{
return a;
}

//fun2
int fun2(int& a)
{
return a;
}

int x;
const int y;
fun1(x);     //正确
fun1(y);     //正确
fun1(3);     //正确

fun2(x);     //正确
fun2(y);     //错误
fun2(3);     //错误;常数没有地址,对常数的引用必须为const&,或者不引用

使用引用的时候,实参不要为是临时变量,因为临时变量如果在传递给引用类型的形参后会被销毁,这样形参也就不存在了。

对于const&的使用还有一点就是在函数的开头或者最后,const放在函数末尾时,函数称为常成员函数;在常成员函数中,无法使用非常成员函数。另外,常量引用的变量,只能调用常成员函数,这一点要特别注意,尤其在某个函数中通过const&的形参调用另一函数时。
常成员函数可以被各种类型的变量调用(常量或者一般变量),非常成员函数只能使用非常成员变量来调用。

//class line
//成员函数:FootPoint
Point FootPoint(const Point &footPoint)const
{
	Vector lineVector( m_startPoint - m_endPoint);
	lineVector.Unitization();
	double d = lineVector.Dot(m_startPoint-footPoint);
	lineVector*d;
	return m_startPoint + lineVector;
}

//函数: IntersectPoint
int IntersectPoint(
    const Circle &circle,    
	const Line   &line,  
	Point        &ioFirstIntersectPoint,  
	Point        &ioSecondIntersectPoint)
{
	Point  centerPoint = circle.GetCenter();
	double radius      = circle.GetRandius();
	Vector lineVector  = line.GetLineVector();
	double distance    = ((centerPoint-line.m_endPoint).Cross(lineVector)).Length(); 
	//先求垂足,再利用叉乘求圆心到垂足的距离
	if (distance-radius>1e-10)											
	{
		std::cout << "圆与直线相离";
		return 0;
	}
	else if(abs(distance-radius)<=1e-10)
	{
		std::cout << "圆与直线相切,切点为" << std::endl;
		//const& 变量line调用其常成员函数,如果将FootPoint函数后面的const去掉,这里将出错
		Point intersectPoint   = line.FootPoint(centerPoint);
		ioFirstIntersectPoint  = intersectPoint;
		ioSecondIntersectPoint = intersectPoint;
		return 1;
	}
   else
   {
   //code...
   }
}

当const在函数返回值之前修饰函数返回值时,如果返回值为指针,则返回值只能被赋值给const修饰的同类型指针;如果返回不是指针,在函数返回值之前加const没有意义,不影响函数使用。

//返回为指针
const int* fun(const int& a)
{
	return &a;
}
int t = 3;
int* a = fun(t);        //错误
const int* b = fun(t);  //正确

//返回不是指针
const int fun(const int& a)
{
	return a;
}
int t = 3;
int a = fun(t);        //正确
const int b = fun(t);  //正确

第一次写,由于是之前查阅资料时整理的,因此文中有些是摘抄或者借鉴了他人文章中的内容,当时没有记录出处,敬请谅解!
楼主为刚刚入门的菜鸟,文中不对的地方欢迎大家指正,相互交流学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值