const对象引用做为形参

2014-11-24 07:36:08 · 作者: · 浏览: 0
今天在写代码的时候,发现添加了下面的这个函数(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类型的。