没有成员函数的类实例的默认返回

Posted

技术标签:

【中文标题】没有成员函数的类实例的默认返回【英文标题】:Default return of class instance without member function 【发布时间】:2018-04-12 16:16:00 【问题描述】:

当对象在某处使用时(不使用getter成员函数),是否可以让类默认返回特定的成员变量?

如果我有这门课:

class A
    public: 
       A(int nr) : number(nr);
       ~A();
       int getNr() return this->number ;
       int number;
;

稍后在程序中设置和获取它的编号,我可以这样做:

int main()
    A thing(23);
    std::cout<<"Your number is: "<<thing.getNr();
    return 0;

但我想做的是:

std::cout<<"Your number is: "<<thing;

并得到完全相同的结果,使其默认返回成员变量“number”。这可以以某种方式完成/设置吗?

我知道有人可能会想“为什么不直接使用整数呢?” - 我正在创建一个应该能够“变成的类>" 任何类型,然后像分配的类型一样,如果我能在这方面让它像整数、双精度和字符串一样,那就太好了。

【问题讨论】:

可能重复:***.com/questions/4469894/… en.cppreference.com/w/cpp/language/implicit_conversion看看这个 【参考方案1】:

您的具体示例在A 上调用&lt;&lt; stream insertion operator。这个运营商can be overloaded做你想做的事:

#include <iostream>

class A
    public: 
        A(int nr) : number(nr)  
        ~A()  
        int getNr() const  return this->number; 
        int number;
;

std::ostream& operator<<(std::ostream& os, const A& a) 
    os << a.getNr();
    return os;


int main(int, char *[]) 
    A a(42);
    std::cout << a << std::endl; // prints 42

请注意,我已对您的代码进行了其他一些小修复(修复了缺失的; 并删除了一些不必要的;将const 添加到getNr())。

对于其他情况,例如将A 类型的参数传递给接受不同类型参数的函数,您可以定义user-defined conversion operators,由编译器调用以将A 转换为不同类型。例如:

void doSomething(int x) 
    // ...


class A
    public: 
        A(int nr) : number(nr)
        ~A()
        int getNr() return this->number; 
        int number;
        operator int()  return getNr(); 
;

int main(int, char *[]) 
    A a(42);
    doSomething(a); // calls operator int() above
    return 0;

小心使用用户定义的转换运算符。特别是,通常最好将它们标记为explicit 并使用static_cast&lt;T&gt;() 来触发转换。隐式转换会很快让您在重载解析方面遇到麻烦。

【讨论】:

以上是关于没有成员函数的类实例的默认返回的主要内容,如果未能解决你的问题,请参考以下文章

c++之构造函数,析构函数(五千字长文详解!)

声明既没有默认构造函数也没有复制构造函数的成员变量

Lua实现简单的类,继承,多态 实例

为啥未使用的成员模板函数的类模板实例化失败

具有引用数据成员的类的默认构造函数?

具有相同的成员函数对不同的类实例有不同的定义