8

使用complex类和库,如何将复数分配给变量?

我知道我可以在第一次实例化复数时设置该值。
我也明白我可以将一个实例化的复数分配给另一个。
如何直接将复数分配给变量?

参考:
http ://www.cplusplus.com/reference/complex/complex/operators/

例子:

#include <iostream>
#include <complex>

int main() {
    complex<double> a(1.2,3.4), b;
    cout << a; //-> (1.2,3.4)
    b = a;
    cout << b; //-> (1.2,3.4)
    b = (1.2,3.4);
    cout << b; //-> (3.4,0) <-- what the heck is this??
    return 0;
}
4

4 回答 4

10

对于(1.2,3.4),将调用内置的逗号运算符。

在逗号表达式 E1, E2 中,表达式 E1 被求值,其结果被丢弃,并且它的副作用在表达式 E2 的求值开始之前完成(注意,用户定义的运算符,不能保证顺序)。

逗号表达式结果的类型、值和值类别正是第二个操作数 E2 的类型、值和值类别。如果 E2 是临时的,则表达式的结果就是那个临时的。如果 E2 是位域,则结果是位域。

这意味着1.2将被评估然后丢弃,最后3.4返回。

Sob = (1.2,3.4);等价于b = 3.4;, 它将调用std::complex::operator=(const T& x):

分配x给复数的实部。虚部设置为零。

这就是为什么你得到(3.4,0).

正如@paddy 建议的那样,您可以解决以下问题:

b = {1.2,3.4};                 // copy-list-initialization (since c++11)
b = complex<double>(1.2, 3.4); // copy assignment via a temporary complex<double>
b = decltype(b)(1.2, 3.4);     // same as the above (since c++11)
于 2016-03-23T04:02:27.373 回答
6

试试这个,你可以b={1.2, 3.4}用来分配一个复杂的值

#include <complex>
#include <iostream>
using namespace std;
int main()
{
    complex<double> a = {1,2};
    complex<double> b;

    b = {1.2, 3.4};

    cout << a + b << "\n"; // (2.2,5.4)

}
于 2016-03-23T04:07:37.403 回答
4

您对类使用赋值运算符的方式=std::complex分配real part了复数。

所以b = (1.2,3.4);相当于只改变了的实b3.4

要直接分配一个复数,我认为您可以使用b = complex<double>(1.2,3.4);

于 2016-03-23T04:05:08.383 回答
1

我只是想和这个坏男孩一起行动,对 C++14 的赞美:

#include <iostream>
#include <complex>

int main() {
    using namespace std::literals;
    std::complex<double> b;
    b = 1.2 + 3.4i;
    std::cout << b << "\n";
}
于 2016-03-23T06:13:21.177 回答