面试前必须要知道的C++ const用法
2020-03-10 16:01:28来源:博客园 阅读 ()
面试前必须要知道的C++ const用法
本文主要介绍const修饰符在C++中的主要用法,下面会从两个方面进行介绍:类定义中使用const、非类定义中使用const
1. 非类定义中使用const
非类定义中使用const是指:在除了类定义以外的场景中使用const。
1.1 变量
const int a = 1; //定义一个常量,不可以修改
int b = 2; //定义一个普通变量,可以修改
const int &b = a; //定义一个常量引用,不可以通过引用b修改a,底层const
const int *p = &a; //定义一个普通变量,p可以修改,但是不可以通过p修改所指向的对象a,底层const
int * const q = &b; //定义一个常量指针,q不可以修改,但是可以通过q修改所指向的对象b,顶层const
const int * const s = &a; //定义一个常量指针,s不可以修改,同时不可以通过s修改所指向的对象a,靠右的是顶层const,靠左的是底层const
顶层const:变量本身是个常量
底层const:变量所指向的对象是个常量
用于声明引用的const都是底层const
1.2 函数
int fun1(const int a); //定义一个常量形参
const int fun2(int a); //等同于'int fun1(const int a);'因为函数返回的是返回值的副本
const int& fun3(int &a); //返回常量引用,不会进行对象的拷贝(注意:不要返回局部对象的引用或者指针)
const int& fun4(int a); //这实际上是一种错误的声明方式,该函数可能会返回局部对象的引用或者指针
Tips:
- 引用只是一个变量的别名,不是对象,因此引用不会占用存储空间
- 调用一个返回引用的函数得到左值,其他返回类型得到右值
2. 类定义中使用const
2.1 类成员
class Test{
public:
Test():a(10){}
void display();
private:
const int a;
};
- 类定义中不能进行初始化,因为在头文件中定义只是一个声明,并没有分配真正空间,因此变量是不存在的,因此是不能赋值的。
- 在类定义外部,const定义的变量是不能被赋值
问题:
类定义中不能赋值,类定义外部也不能赋值,但是又必须赋值,这可如何是好?
解决方案:
- 在构造函数后的参数初始化列表中初始化
- 将const变量同时声明为 static 类型进行初始化
class Test{
public:
Test():a(10){}
void display();
private:
const int a;
//static const int a;
};
//const int Test::a = 5;
2.2 类成员函数
class Test{
public:
//下面是display函数的两个重载版本
void display(); //一个普通成员函
void display() const; //一个const成员函数。
private:
const int a;
};
Tips:
成员函数都有一个额外的隐式参数this,this的值是调用该函数的对象地址,因此this是一个指针。
普通成员函数的this指针类型是:Test* const this
const成员函数的this指针类型是:const Test* const this
Test t1;
const Test t2;
t1.display(); //调用void display()
t2.display(); //调用void display() const
因为两个函数的this指针类型不同,所以display有两个重载函数。
作用:
为了在函数体内禁止修改对象,可以通过定义const成员函数来实现。
Others:
下图是截自C++ primer中的片段,请重点关注两个display函数的返回值:
display 普通成员函数的返回值是:普通引用
display const成员函数的返回值是:常量引用
造成返回值不同的原因就是:this指针类型不同
3. 参考资料
- C++ primer 第五版-P57、P201、P231、P247
- C++ non-const lvalue reference cannot bind to a temporary
原文链接:https://www.cnblogs.com/wengle520/p/12458533.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:洛谷P1034 矩形覆盖
下一篇:结构体与链表
- [题记-数学-面试题]约瑟夫环-leetcode 2020-03-30
- 简述c和c++的基本区别,你真的懂吗?(面试必学) 2019-12-06
- 2019 C/C++《阿里》面试题总结 2019-11-28
- 剑指offer笔记面试题1----赋值运算符函数 2019-10-18
- c/c++面试指导---c语法总结 2019-03-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash