C++ 对于两种版本的函数,常量成员函数和不带常量的函数,Can重载是可能的
我刚刚遇到了各种重载方法,比如传递的参数类型、不同数量的参数、返回类型等。我只想知道我可以用以下两个版本重载函数吗 //function which can modify member String& MyClass::doSomething(); //constant member function String& MyClass::doSomething() const; //可以修改成员的函数 String&MyClass::doSomething(); //常数成员函数 String&MyClass::doSomething()常量; 请告诉我背后的原因。可以 如果你有C++ 对于两种版本的函数,常量成员函数和不带常量的函数,Can重载是可能的,c++,function,constants,overloading,C++,Function,Constants,Overloading,我刚刚遇到了各种重载方法,比如传递的参数类型、不同数量的参数、返回类型等。我只想知道我可以用以下两个版本重载函数吗 //function which can modify member String& MyClass::doSomething(); //constant member function String& MyClass::doSomething() const; //可以修改成员的函数 String&MyClass::doSomething(); //常数成员函数 String&
MyClass m;
m.doSomething();
将调用非常量版本。当你有
const MyClass m;
m.doSomething();
将调用常量版本。是的,您可以这样做。
(@Job,这不是返回类型的重载,这是被调用类实例的“const state”的重载)
如果实例是const,则调用第二个变量,如果不是,则调用第一个变量。
实际用途是,如果在const实例上调用该方法,您可能还希望返回“const String&”(例如,如果您返回对类成员的引用),如下所示:
//function which can modify member
String& MyClass::doSomething();
//constant member function
const String& MyClass::doSomething() const;
String& MyClass_doSomething(MyClass *this);
String& MyClass_doSomething(const MyClass *this);
这不仅是可能的,而且是一个常用的习语
例如,如果调用函数的
const
版本,则可以返回对结果只读版本的引用。但是如果调用了非const
版本,则会构造并返回一个副本,接收方可以修改该副本。通过实现一个const
版本,我们可以避免在知道不需要构造时执行构造。理解这一点的简单方法是将调用该方法的对象视为第0个参数:
e、 g:想想
String& MyClass::doSomething();
MyClass mc;
mc.doSomething();
作为一种奇特的、编译器支持的方法:
String& MyClass_doSomething(MyClass *this);
MyClass mc;
MyClass_doSomething(&mc);
现在,基于常量的重载只是参数类型重载的一个特例:
String& MyClass::doSomething();
String& MyClass::doSomething() const;
可以这样想:
//function which can modify member
String& MyClass::doSomething();
//constant member function
const String& MyClass::doSomething() const;
String& MyClass_doSomething(MyClass *this);
String& MyClass_doSomething(const MyClass *this);
关于这一点的有用性,最简单的例子是各种std::
容器上的begin
和end
方法。如果向量
/字符串
/无论什么都是非常量,并且您调用了begin()
,您将返回一个迭代器
,该迭代器可用于修改原始容器的内容。显然,对于标记为const
的容器,这是不允许的,因此,由于const/non-const重载,在const向量上调用begin()
将返回一个const\u迭代器,该迭代器可用于读取向量的内容,但不能修改它
e、 g
string nc=“你好世界”;
对于(字符串::迭代器iString=nc.begin();iString!=nc.end();++iString)
{
CUT< P>这是迭代器使用的方式。你有一个const迭代器和一个非const。< /p>你使用什么语言?如果你想让它得到正确的注意,你应该用语言来标记这个问题。编辑的语言,我使用的是C++,你不能在C++中返回超载类型。我知道问题不是关于返回类型的重载而是H。e在他的问题中提到,他认为这是可能的。