2016-03-23 37 views
5

Korzystając z klasy i biblioteki complex, w jaki sposób przypisać do zmiennej numer zespolony?Jak bezpośrednio przypisać liczby zespolone do zmiennej?

Rozumiem, że mogę ustawić wartość, gdy po raz pierwszy utworzę numer zespolony.
Rozumiem również, że mogę przypisać jedną instancjonowaną liczbę zespoloną do drugiej.
Jak mogę bezpośrednio przypisać liczbę zespoloną do zmiennej?

odniesienia:
http://www.cplusplus.com/reference/complex/complex/operators/

przykład:

#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; 
} 
+1

Wyszukaj operatora przecinka. –

+0

to zostanie wydrukowane w ten sposób, tylko zobacz to (_ Format, w którym są sformatowane do wstawienia danych wyjściowych to (rzeczywisty, imag) _) z twojego refernku. [http://www.cplusplus.com/reference/complex/complex/operators/] –

Odpowiedz

9

Na (1.2,3.4), built-in comma operator zostanie wywołana.

w wyrażeniu przecinkami E1, E2, której ekspresji E1 ocenione, jego wynik jest odrzucana, a skutki uboczne są zakończone przed oceną ekspresji rozpoczyna E2 (należy zauważyć, że operator zdefiniowany przez użytkownika nie może zagwarantować sekwencjonowanie).

Typ, wartość i kategoria wartości wyniku przecinka to dokładnie typ, wartość i kategoria wartości drugiego argumentu E2. Jeśli E2 jest tymczasowe, wynikiem wyrażenia jest tymczasowy. Jeśli E2 jest polem bitowym, wynikiem jest pole bitowe.

To oznacza, że ​​1.2 zostanie ocenione, a następnie odrzucone, w końcu zwracane jest 3.4.

Więc b = (1.2,3.4); jest równoważna b = 3.4;, który wezwie std::complex::operator=(const T& x):

Przypisuje x do części rzeczywistej liczby zespolonej. Część wyobrażona jest ustawiona na zero.

Dlatego otrzymujesz wynik (3.4,0).

Jak @paddy zasugerował, można rozwiązać ten problem tak:

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) 
+4

To wyjaśnia zachowanie, ale nie odpowiada na pytanie. Być może sugerują, że poprawka ma używać 'b = complex (1.2, 3.4);' lub nawet 'b = decltype (b) (1.2, 3.4);' – paddy

3

Sposób stosowany swoją operator przypisania = dla klasy std::complex tylko przypisany real part z liczby zespolonej.

Tak więc b = (1.2,3.4); jest odpowiednikiem zmiany rzeczywistej części b na 3.4 tylko.

Aby przypisać liczbę zespoloną bezpośrednio myślę, że można użyć b = complex<double>(1.2,3.4);

+1

Uważaj na swoje sformułowania. Nie można powiedzieć, że "operator przypisania przypisuje tylko część rzeczywistą", a następnie dostarczyć rozwiązanie, które poprawnie używa operatora przypisania. Istnieje więcej niż jeden operator przypisania dla 'std :: complex '. Zobacz http://pl.cppreference.com/w/cpp/numeric/complex/operator%3D – paddy

6

Spróbuj tego, można użyć b={1.2, 3.4} przypisać wartość zespoloną

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

} 
1

Chciałem tylko, aby w sprawie ustawy z tym zły chłopiec, komplementy z 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"; 
} 
+0

1. Ten obszar nazw '' std :: literals'' daje mi błąd. 2. Wierzysz, że miałeś zamiar "cout << b'"? 3. W rezultacie otrzymuję (1.2.0), po dostosowaniu na 1 i 2. – kmiklas

+0

Tak, 'b'. Potrzebujesz jednak kompilatora C++ 14. –