没有成员函数的 class 个实例的默认 return

Default return of class instance without member function

当对象在某处使用时(不使用getter成员函数),是否可以默认使classreturn成为一个特定的成员变量?

如果我有这个class:

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;

得到完全相同的结果,默认将其return成员变量“number”。这会是 done/set 吗?

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

您的具体示例调用 << stream insertion operator on an A. This 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>() 来触发转换。隐式转换会很快让您陷入重载解析的麻烦。