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