调用对象时C ++返回对象成员变量?

Posted

技术标签:

【中文标题】调用对象时C ++返回对象成员变量?【英文标题】:C++ return object member variable when object is called? 【发布时间】:2020-08-27 12:58:56 【问题描述】:

如何让一个类在被调用时返回一个成员变量?说:

class Person 
    std::string name;

    // Constructor and Destructor go here..
;

Person mike = "Mike";

// /!\ How do you make "mike" return "Mike" directly when the object mike is called?
//  This is the same thing like an int return its value and a vector returns its members (scalars)
std::string name = mike;

附加编辑:强制转换运算符在这里不是一个好选择,因为它破坏了类型的编写方式。例如std::string name = static_cast<string>(mike); 是实现我的目标的可怕方式。

【问题讨论】:

听起来您正在寻找"cast operator"? @0x5453 Python中没有类似“repr”的东西吗?我不是 Python 方面的专家,但我认为这种方法实现了我正在尝试做的事情。 Python 和 C++ 是两种不同的语言。 C++ 有自己的一套范式、习语和规则。 @xxdraxulis 你总是可以重载to_string(const Person&)operator<<(std::ostream&, const Person&),但它们的行为与Python 的__repr__ 不太一样。 考虑隐式转换的代价是(不那么明显)。突然之间,在需要 std::string 的情况下,使用 Person 不会出现编译器错误。转换是有意的还是逻辑错误?现在由你决定,编译器不再提供帮助 【参考方案1】:

你正在寻找一个转换运算符,它是这样写的:

class Person 
    std::string name;
 public:
    Person(char const * name) : name(name) 
    operator std::string () const  return name; 
;

这是demo。

您也可以将转换运算符设为模板,如下所示:

template<typename T>
operator T() const  return name; 

这是demo。

【讨论】:

如果它不需要 static_cast&lt;&gt;(); 运算符,那么这回答了我的问题。现在您知道如何将其作为模板工作了吗?我的类是模板,所以我不想为每种类型显式地实现这个函数。谢谢。 @xxdraxulis 当然,您可以将其模板化,添加到答案中。 不相关,但请注意,如果 namenullptr,则 Person(char const * name) : name(name) 是 UB。为什么std::string 在那种情况下不会构造为空,这超出了我的理解。 Person(char const * name) : name(name?name:"")

以上是关于调用对象时C ++返回对象成员变量?的主要内容,如果未能解决你的问题,请参考以下文章

对象的构造与析构

c++_构造与析构

c++_构造与析构

c++_构造与析构

c+学习记录

C++再识类和对象