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

时间:2016-04-06 17:36:16

标签: c++ constructor ternary-operator

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

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;
}

在调用isTrue函数之后,使用Debuger的一些方法是,被调用的构造函数是使用一个对象的构造函数: myClass(int x)  但我想使用这两个参数,我如何调用另一个: myClass(int x, int y)使用三元运算符?

1 个答案:

答案 0 :(得分:1)

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

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);