如何在没有显式方法声明的情况下返回值

How to return a value without an explicit method declaration?

本文关键字:声明 方法 情况下 返回值      更新时间:2023-10-16

在没有方法的情况下调用类时,类是否可以返回值?

例如:

class myClass{
private:
int iVal;
public:
setVal(const int i){ iVal = i; }
} 
myClass m;
m.setVal(3);
cout << m << endl;
// In this case, m would return 3;

我显然遗漏了很多东西,但这种操作可能吗?

在没有方法的情况下调用类时,类是否可以返回值?

我怀疑我们必须将您的问题解读为"在没有显式getter方法声明的情况下调用时返回值?">

是的,你可以提供一个过载的演员扮演操作员:

class myClass{
private:
int iVal;
public:
void setVal(const int i){ iVal = i; }
// vvvvvvvvvvvvvv
operator int() const {
return iVal;
}
};

请参阅现场演示

您的代码还修复了一些其他小错误


这允许您在任何上下文中使用myClass,因为它只是int值:

int main()
{
myClass m;
m.setVal(3);
int x = m + 5; // <<<<<<<<<<<<<<<<<<<<
std::cout << x << std::endl; // outputs 8
}

实时演示


std::ostream& operator<<(std::ostream&, T)实现将使用此重载自动推导intmyClass强制转换重载。


至于您的评论:

我认为描述我的意思的最佳方式类似于其他类处理这一问题。例如,字符串可以在没有方法的情况下打印,所以我想知道如何实现它。

这应该是这样的:

class myClass{
private:
int iVal;
double dVal;    
public:
void setVal(const int i){ iVal = i; }
void setVal(const double d){ dVal = d; }
operator std::string () const {
std::ostringstream oss;
oss << "myClass { iVal = " << iVal 
<< ", dVal = " << dVal  
<< " }";
return oss.str();
}
};

在这种情况下,需要显式调用强制转换运算符,如下所示:

int main()
{
myClass m;
m.setVal(3);
m.setVal(3.14);
std::cout << (std::string)m << std::endl;
// ^^^^^^^^^^^^^
}

另一个现场演示

或者当然使std::ostream& operator<<(std::ostream&, const myClass&)运算符过载。

首先,您不想返回一个值,您想将一个值写入std::ostream,其中cout是它的一个实例,它通常链接到您的控制台。

#include <iostream>
class myClass{
private:
int iVal;
public:
void setVal(const int i){ iVal = i; }
int getVal() const { return iVal; }
};
std::ostream& operator<< ( std::ostream& in, const myClass& c)
{
in << c.getVal();
return in;
}
int main()
{
myClass m;
m.setVal(3);
std::cout << m << std::endl;
}

但有几点需要记住:

首先,operator在这里不是类成员。如果它不是类成员,则不能访问私有成员。为此,您可以将operator作为类的朋友,或者准备一个getter方法,如示例所示。

如果你需要friend变体,可以这样使用:

...
public:
void setVal(const int i){ iVal = i; }
friend std::ostream& operator<< ( std::ostream& in, const myClass& c);
...
std::ostream& operator<< ( std::ostream& in, const myClass& c)
{
in << c.iVal;
return in;
}