Этот код вам поможет, и это довольно понятно:
#include <stdio.h> /* Standard Library of Input and Output */
#include <complex.h> /* Standard Library of Complex Numbers */
int main() {
double complex z1 = 1.0 + 3.0 * I;
double complex z2 = 1.0 - 4.0 * I;
printf("Working with complex numbers:\n\v");
printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", creal(z1), cimag(z1), creal(z2), cimag(z2));
double complex sum = z1 + z2;
printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));
double complex difference = z1 - z2;
printf("The difference: Z1 - Z2 = %.2f %+.2fi\n", creal(difference), cimag(difference));
double complex product = z1 * z2;
printf("The product: Z1 x Z2 = %.2f %+.2fi\n", creal(product), cimag(product));
double complex quotient = z1 / z2;
printf("The quotient: Z1 / Z2 = %.2f %+.2fi\n", creal(quotient), cimag(quotient));
double complex conjugate = conj(z1);
printf("The conjugate of Z1 = %.2f %+.2fi\n", creal(conjugate), cimag(conjugate));
return 0;
}
& nbsp; с:
creal(z1)
: получить действительную часть (для float crealf(z1)
, для длинного двойного creall(z1)
)
cimag(z1)
: получить мнимую часть (для float cimagf(z1)
, для long double cimagl(z1)
)
Еще один важный момент, который следует помнить при работе со сложными числами, состоит в том, что функции, такие как cos()
, exp()
и sqrt()
, должны быть заменены сложными формами, например ccos()
, cexp()
, csqrt()
.
Что заставляет Вас сказать, что или одиночный элемент или статический метод не ориентированы на многопотоковое исполнение? Обычно оба должен быть реализованным, чтобы быть ориентированным на многопотоковое исполнение.
большая разница между одиночным элементом и набором статических методов - то, что одиночные элементы могут реализовать интерфейсы (или произойти из полезных базовых классов, хотя это менее распространено, по моему опыту), таким образом, можно раздать одиночный элемент, как будто это была "просто другая" реализация.
Статический класс является тем, который имеет только статические методы, для которых лучшее слово было бы "функциями". Стиль дизайна, воплощенный в статическом классе, является чисто процедурным.
Singleton, с другой стороны, является шаблоном, характерным для дизайна OO. Это - экземпляр объекта (со всеми возможностями, свойственными от этого, такими как полиморфизм), с процедурой создания, которая гарантирует, что существует только когда-либо один экземпляр той конкретной роли за ее все время жизни.
В шаблоне "одиночка" можно создать одиночный элемент как экземпляр производного типа, Вы не можете сделать этого со статическим классом.
Быстрый Пример:
if( useD3D )
IRenderer::instance = new D3DRenderer
else
IRenderer::instance = new OpenGLRenderer
SELECT *
вместо SELECT COUNT
?
– Lode
1 September 2010 в 17:34
Хорошо одиночный элемент является просто нормальным классом, который инстанцируют, но только однажды и косвенно из клиентского кода. Статический класс не инстанцируют. Насколько я знаю статические методы (статический класс должен иметь статические методы), быстрее, чем нестатичный.
Редактирование:
описание правила Работы FxCop: "Методы, которые не получают доступ к данным экземпляра или называют методы экземпляра, могут быть отмечены как статичные (Совместно использованный в VB). После выполнения так, компилятор испустит сайты невиртуального вызова этим участникам, которые предотвратят проверку во времени выполнения для каждого вызова, который обеспечивает, чтобы текущий объектный указатель был непустым. Это может привести к измеримому увеличению производительности для чувствительного к производительности кода. В некоторых случаях отказ получить доступ к текущему экземпляру объекта представляет проблему правильности".
я на самом деле не знаю, применяется ли это также к статическим методам в статических классах.
Singleton инстанцируют, это просто существует только один экземпляр, который когда-либо инстанцируют, следовательно единственный в Singleton.
А статический класс не может инстанцировать ничто кроме себя.
Истинный ответ Jon Skeet, на другом форуме здесь .
одиночный элемент А предоставляет доступ к единственному созданному экземпляру - что экземпляр (или скорее ссылка на тот экземпляр) можно передать в качестве параметра другим методам и рассматривать как обычный объект.
А статический класс позволяет только статические методы.
Шаблон "одиночка" имеет несколько преимуществ перед статическими классами. Во-первых, одиночный элемент может расширить классы и реализовать интерфейсы, в то время как статический класс не может (он может расширить классы, но он не наследовал их членов экземпляра). Одиночный элемент может быть инициализирован лениво или асинхронно в то время как статический класс обычно инициализируется, когда он сначала загружается, ведя к потенциальным проблемам загрузчика класса. Однако самое важное преимущество, тем не менее, состоит в том, что одиночные элементы могут быть обработаны полиморфно, не вынуждая их пользователей предположить, что существует только один экземпляр.
Я не большой теоретик объектно-ориентированного программирования, но, насколько мне известно, я думаю, что единственная особенность объектно-ориентированного программирования, которой не хватает статическим классам по сравнению с синглтонами, - это полиморфизм. Но если он вам не нужен, то со статическим классом вы, конечно, можете иметь наследование (не уверены в реализации интерфейса) и инкапсуляцию данных и функций.
Комментарий Морендила: «Стиль дизайна, воплощенный в статическом классе, - это чисто процедурный "Я могу ошибаться, но я не согласен. В статических методах вы можете получить доступ к статическим членам, что будет точно так же, как одноэлементные методы, обращающиеся к своим членам единственного экземпляра.
редактировать:
На самом деле сейчас я думаю, что еще одно отличие состоит в том, что статический класс создается при запуске программы * и живет на протяжении всего жизненного цикла программы, в то время как синглтон явно создается в какой-то момент и может быть уничтожен также.
* или он может быть создан при первом использовании, я думаю, в зависимости от языка.