【问题标题】:initializtion class object error using ternary operator使用三元运算符初始化类对象错误
【发布时间】:2016-07-27 06:46:23
【问题描述】:

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

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 函数之后,被调用的构造函数是使用一个对象的构造函数: myClass(int x) 但我想同时使用这两个参数,如何调用另一个参数: myClass(int x, int y) 使用三元运算符?

【问题讨论】:

  • 您即将了解逗号运算符。什么是“短如果”?
  • 提供合适的拷贝构造函数并写myClass cc = isTrue(aa,bb) ? myClass(aa,bb) : myClass (bb,bb);
  • 我应该忽略复制构造函数并按照你说的那样写吗?还是我必须实现它?
  • @raptor0102 它被称为“三元运算符”而不是“短 if”。
  • 它的工作!谢谢!

标签: c++ constructor ternary-operator


【解决方案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);

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 2010-12-20
    • 2013-07-27
    • 2023-01-02
    • 2012-07-14
    • 2013-03-30
    • 2015-07-11
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多