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

时间:2018-04-12 16:16:00

标签: c++ class return default

当某个地方使用该对象时,是否可以使一个类默认返回一个特定的成员变量(不使用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 ”。这可以以某种方式完成/设置吗?

我知道有人可能在想“为什么不直接使用整数?” - 我正在创建一个应该能够“变成“任何类型,然后像指定的类型一样,如果我能够使它在这方面的行为更像是整数,双打,字符串,那将是很好的。

1 个答案:

答案 0 :(得分:2)

您的具体示例会在<<上调用A 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<T>()来触发转化。隐式转换可以很快解决重载问题。