使用三元运算符初始化类对象错误

initializtion class object error using ternary operator

本文关键字:初始化 运算符 对象 错误 三元      更新时间:2023-10-16

我试图使用三元运算符创建一个对象,但每次都只调用第一个。这是我的简单代码:

bool itTrue(int x, int y){
  if(x>y)
     return true;
  return false;
}
class myClass {
    public:
       myClass(int x){
          val=x;
      }
       myClass(int x, int y){
          val=x*y;
      }
      val=0;
 };
int main(){
   aa=5;
   bb=6;
   myClass cc = isTrue(aa,bb) ? (aa,bb) : (bb,bb);
   cout<<cc.val<<endl;
   return 0;
}

使用Debuger,在调用isTrue函数后,被调用的构造函数是使用一个对象的构造函数:myClass(int x)但我想同时使用这两个论点,我该如何称呼另一个:myClass(int x, int y)使用三元运算符?

在您尝试回答自己的全部问题之前,我们应该看看当我们将其简化为不包括三元运算符时会发生什么:

myClass cc = (aa, bb);

这也会调用单参数构造函数,因为这不是将参数传递给构造函数的方式,它与不同

myClass cc(aa, bb);

相反,您正在做的是调用"逗号运算符"。您应该查看传递给单个值构造函数的值,您会发现它是bb的值。

#include <iostream>
class A {
public:
    A(int a) {
        std::cout << "single " << a << 'n';
    }
    A(int a, int b) {
        std::cout << "double " << a << ',' << b << 'n';
    }
};
int main()
{
    int aa = 5;
    int bb = 6;
    A a = (aa, bb);
}

http://ideone.com/wapbv9

逗号运算符计算左侧的表达式,放弃它并计算右侧的表达式。所以你实际写的是:

(void)aa;  // a way to say "evaluate this and ignore it"
A a = bb;

为了实现您想要实现的目标,您需要构建一个类的实例:

myClass cc = isTrue(aa, bb) ? myClass(aa, bb) : myClass(bb, bb);
相关文章: