C++转换运算符
我知道这笔交易。编译器尝试在转换运算符的帮助下将一个对象转换为其他对象的类型。有两种方法可以做到这一点。构造函数(将一个类转换为另一个类)或转换运算符。所以,这个只是为了测试我是否完全掌握了这些概念。下面的代码给出了错误
using namespace std ;
class A
{
int i ;
public:
A(int a=0){this->i=a;}
A operator+(const A& b){
A c ;
return c(this->i+b.i);
}
void show()
{
cout<<i<<endl;
}
};
int main()
{
A a1(1),a2(2),a3;
a3=a2+a1;
a3.show();
return 0;
}
,我猜错误出在运算符 + 中。当我尝试分配 A(i) 时。没有匹配可以从 int 创建 A 的运算符。
但是然后我看到这个 A 的构造函数潜伏在后面。它可以将 int 转换为 A 。假设,它确实将 int 转换为 A 。然后,调用变成 A(B) 。这相当于复制构造函数。因此,这呼叫应该有效。但事实并非如此。总而言之,我很困惑。
请帮忙。
I know the deal .The compiler tries to convert one object into the other objects's type with the help of conversion operator .Two ways to do this .Constructor (Converts a class to the other) or conversion operator .So , this one is just to test if I am thorough with the concepts .The code below gives the error
using namespace std ;
class A
{
int i ;
public:
A(int a=0){this->i=a;}
A operator+(const A& b){
A c ;
return c(this->i+b.i);
}
void show()
{
cout<<i<<endl;
}
};
int main()
{
A a1(1),a2(2),a3;
a3=a2+a1;
a3.show();
return 0;
}
I guess the error is in the operator + .When I try to assign A(i) .There is no match for an operator which could create an A from an int .
But Then I see this A's constructor lurking behind .It can convert an int into an A .Suppose , it does convert int into an A.Then , the call becomes A(B) .This is equivalent to the copy constructor .Hence , this call should work .But it doesn't .All in all , am pretty confused .
Please help .
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在这两行中,您告诉编译器使用默认构造函数构造一个 A 对象,然后调用其不存在的运算符 () (int) 并返回其返回值:
使用
或
旁注,这是隐式转换运算符的示例,对于你的类:
但是它们的使用闻起来像是糟糕的设计,并且可能导致糟糕的事情发生,比如隐式转换为 bool 或指针。请使用其他内容,例如 int toInt () const 成员函数。
In these two lines you are telling the compiler to construct an A object with the default constructor, then call its nonexistent operator () (int) and return its return value:
Use either
or
On a side note, an example for an implicit conversion operator, for your class:
But their use smells like bad design, and can cause bad stuff to happen, like implicit conversion to bool or a pointer. Use something else instead, like an
int toInt () const
member function.