学习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);  //正确

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

const与const相关推荐

  1. const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

    前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习 ...

  2. 喜闻乐见的const int *p、int* const p、const int* const p

    不废话直接代码示例: 1 void f(const int *p) { 2 3 int b = 10; 4 5 *p = 10; // error 6 7 p = &b; // fine 8 ...

  3. const reference const

    const(一) const修饰的各种类型的变量后(包括普通变量,指针,类,结构体和结构体的指针),其初始化的值不可更改 #include <iostream> using namespa ...

  4. const int *,const int * const和int const *有什么区别?

    我总是搞砸了如何正确使用<code>const int* , const int * const和int const * . 是否有一组规则定义您可以做什么和不能做什么? 我想知道在分配, ...

  5. const char*, char const*, char*const 的区别

    把一个声明从右向左读. char * const cp; ( * 读成 pointer to ) cp is a const pointer to char char const * p; p is ...

  6. const int、const int *、int *cosnt、const int * const、const int 的区别

    2018-01-04 创建人:Ruo_Xiao 2018-10-17 修改人:Ruo_Xiao 邮箱:xclsoftware@163.com 修改内容:增加对 delete 指向常量的指针的可行性的说 ...

  7. int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别

     加有const关键字的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = # 1.       可以读自己 2.       可以通过*p改自己 3.       可以 ...

  8. mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’

    编译FAAC-1.28时遇到错误: mpeg4ip.h:126: error: new declaration 'char* strcasestr(const char*, const char*)' ...

  9. 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const

    原文网址:http://www.cnblogs.com/rushuizhijing/archive/2011/08/26/2154737.html 深入理解const char*p,char cons ...

  10. 如何理解const char*, char const*, char*const等

    const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目. 事实上这个概念谁都有,只是三种声明方式非常相似很容易记混. Bjarne在他的T ...

最新文章

  1. QIIME 2教程. 20实用程序Utilities(2021.2)
  2. 【SeeMusic】下载安装并注册 SeeMusic 软件
  3. 当你学不进去的时候,试试“普瑞马法则”
  4. java压缩对象_Java 对象指针压缩
  5. 2020年B站UP主价值研究报告
  6. 区块链教程(四):搭建私链、web3.js基础
  7. 环保公益PSD分层海报,小景合成美好世界
  8. MySQL存储过程的异常处理
  9. ubuntu mysql主从备份_Ubuntu 16 MySQL主从备份配置
  10. DotPass for Mac(密码生成器)
  11. spring aop原理
  12. 如何下载历史版本和最新版本的iar
  13. GitHub中国区前100名到底是什么样的人?(转载)
  14. 可以刻录在cd中的linux,在Linux下刻录CD/DVD
  15. linux平台基于python语言的MYO手环手势识别开发(二)
  16. 第七篇 indicators(2)指标的绘制
  17. 数据结构和算法之二叉树左视图
  18. Windows XP Service Pack 3 修复程序列表
  19. python列表lambda表达式排序sort(key=lambda x:x[1])
  20. 记笔记格式 — markdown 语法

热门文章

  1. Appfuse创建网站访问慢的问题
  2. Linux常用命令一览表
  3. 安装Robo 3T(Robomongo)MongoDB可视化工具
  4. 2017-12-1工作日志--云信音视频通话SDK开启美颜效果
  5. ubuntu 开机黑屏解决办法
  6. 摄像头的像素如何计算
  7. Ai智能语音机器人系统搭建和私有云部署
  8. 原型和原型链和instanceof
  9. 有赞线上拨测系统实践(一)
  10. Scrapy爬虫爬取电影天堂