使用三元运算符初始化类对象错误
initializtion class object error using 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;
}
使用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);
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 为什么初始化时没有调用重载赋值运算符?
- 使用运算符"="在C++中用值初始化对象
- 由于没有使用赋值运算符,映射的值是如何初始化的?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- C++ 类型 'complex<double>' 中类中的复杂初始化不提供调用运算符
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员
- 直接初始化中的转换运算符
- 为什么C++不允许在条件运算符中进行隐式列表初始化?
- 初始化中的模板转换运算符类型推导规则是什么?
- 为什么我的重载运算符+在向自身添加变量时会在返回时使"this"未初始化?