Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于两种版本的函数,常量成员函数和不带常量的函数,Can重载是可能的_C++_Function_Constants_Overloading - Fatal编程技术网

C++ 对于两种版本的函数,常量成员函数和不带常量的函数,Can重载是可能的

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&

我刚刚遇到了各种重载方法,比如传递的参数类型、不同数量的参数、返回类型等。我只想知道我可以用以下两个版本重载函数吗

//function which can modify member String& MyClass::doSomething(); //constant member function String& MyClass::doSomething() const; //可以修改成员的函数 String&MyClass::doSomething(); //常数成员函数 String&MyClass::doSomething()常量; 请告诉我背后的原因。

可以

如果你有

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在他的问题中提到,他认为这是可能的。