博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中const对象引用做为形参
阅读量:4071 次
发布时间:2019-05-25

本文共 1897 字,大约阅读时间需要 6 分钟。

今天在写代码的时候,发现添加了下面的这个函数(update)之后,怎么都编译通不过。大概的原始代码如下:

#include
#include
using namespace std;class SyncScheduler{public: SyncScheduler(string name):_name(name){} string& getName() { return _name; }private: string _name;};void update(const string& name){ cout<
<

   编译器提示下面错误:

main.cpp(22): error C2662: “SyncScheduler::getName”: 不能将“this”指针从“const SyncScheduler”转换为“SyncScheduler &”
1> 转换丢失限定符
   尝试了几种方法后,最后只有将getName函数前后都加上const修饰符后,编译才能通过。
   const string& getName() const { return _name; }
   
   这是什么原因呢?查阅了相关资料后,发现了一些线索。
   "在C++中可以传对象引用,比用指针方便,但是为了避免在函数中对象被修改,需要加const限定符,相应的,在实现对象的成员函数时,也要添加const,这样,因为只有const成员函数才能被const对象调用。"
   先举例说明:

class File{ public: 	File(string filename,string filepath):_filename(filename),_filepath(filepath) { }	const string getFileName() const {return this->_filename;}	string getFilePath() const {return this->_filepath;}private: 	string _filename; 	string _filepath; }; void test(const File& f) { 	cout<<"filename is:"<
<

  从上可看到,成员函数前面的const是可选的,但是其后面的const是必须的。如果去掉getFilePath函数后面的const修饰符,编译器会给出下面错误:

  error C2662: “File::getFilePath”: 不能将“this”指针从“const File”转换为“File &”
  这是因为:const File& f 相当于一个const对象。由于const对象在调用成员函数的时候,会将this指针强制转换为const this,所以它将无法找到相应的const getFilePath()函数,并且编译器也无法将一个const的对象转换为一个普通对象来调用这个普通方法getFilePath()。

  那SyncScheduler::getName()函数为何必须在前面加const修饰符呢?先看下面代码:

class File{ public: 	File(string filename,string filepath):_filename(filename),_filepath(filepath) { }	const string getFileName() const {return this->_filename;}	string getFilePath() const  {return this->_filepath;}private: 	string _filename; 	string _filepath; }; void test1(const string& str){	cout<<"test1 :"<
<

运行结果如下:

test1 :a.out
test2 :a.out
test1 :/root
test2 :/root
ss   is:/root
Press any key to continue . . .
   在上面的结果中可看出,函数前面的const是非必须的。但是,为何SyncScheduler::getName()需要呢。不同之处在于getName返回的是一个引用!为了确保成员_name不会被改变,它的引用者必须也是const类型的。

转载地址:http://hleji.baihongyu.com/

你可能感兴趣的文章
CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
查看>>
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
ssh 如何方便的切换到其他节点??
查看>>
JSP中文乱码总结
查看>>
Java-IO-File类
查看>>
Java-IO-java的IO流
查看>>
Java-IO-输入/输出流体系
查看>>
Java实现DES加密解密
查看>>