没有成员函数的 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>()
来触发转换。隐式转换会很快让您陷入重载解析的麻烦。
当对象在某处使用时(不使用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>()
来触发转换。隐式转换会很快让您陷入重载解析的麻烦。