-
Постов
99 -
Зарегистрирован
-
Посещение
Весь контент nsg
-
Комплекс "AIASM" тебе поможет...На данный момент в комплексе реализованы 15 индексов http://forum.masterforex-v.org/index.php?showtopic=4047
-
А. Я. Архангельский Работа с локальными базами данных в Delphi 5 Книга рассказывает о возможности эффективной работы с базами данных Delphi 5. Основное внимание сосредоточено на методике работы с локальными базами данных. Рассматривается создание баз данных и псевдонимов, простые приложения для работы с базами данных, доступ к базам данных через Microsoft ActiveX Data Objects. Описаны характеристики некоторых типов драйверов, даются справочные сведения по компонентам, свойствам и методам, предназначенных для работы с базами данных. Архангельский Работа с локальными базами данных.rar
-
П. В. Румянцев Азбука программирования в Win32 API (4-е издание) П. В. Румянцев Азбука программирования в Win 32 AP.rar
-
Классы и указатели На прошлых уроках мы видели только один способ объявления экземпляров класса - а именно мы писали что-то вроде: CMyClass z; Вообще же говоря экземпляры класса лучше во многих случаях заводить не в стеке, а в куче (at heap) Это, в частности, связано с тем, что стек - вещь довольно-таки ограниченная по объему, классы же часто представляют из себя довольно-таки большие и сложные объекты, и если вы будете размещать в стеке что-то вроде массива экземпляров класса, то объема стека просто может не хватить (хотя, конечно, для учебных программм это случится навряд ли). Так же как и для встроенных типов данных для размещения экземпляра класса в куче использется оператор new. Именно он и занимается выделением памяти. Вот пример: CMyClass * z; z = new CMyClass; // Непосредственное выделение памяти. Конструктор класса при этом вызовется на второй строке, т. е. в операторе new. Эти два оператора можно объединить: CMyClass * z = new CMyClass; // Непосредственное выделение памяти. Если в классе есть конструктор с параметрами, то он вызывается примерно так: // Вызов конструтора с одним параметром. CMyClass * z = new CMyClass(22); // Вызов конструтора с двумя параметрами. CMyClass * z = new CMyClass(22, 44); Еще одно отличие между двумя способами создания экземпляра класса (в стеке или в куче) - это вызов методов класса. Если при создании экземпляра в стеке между именем экземпляра и именем метода используется точка, то при создании экземпляра класса в куче (т. е. через оператор new) используется стрелочка. Вот пример: CMyClass * z = new CMyClass; z->SomeMethod();
-
Конструкторы и деструкторы Конструкторы и деструкторы - это специальные методы класса. Это надо понять в первую очередь. Разумеется, эти методы обладают целым рядом особенностей (именно по этому они и выделены в специальную группу). Сейчас об этих особенностях и поговорим. Первое. В отличие от других методов они должны называться особым образом. Если обычные методы могут называться как угодно, то имя констуктора должно совпадать с именем класса, а имя деструктора - с именем класса с приписанной в начале тильдой. Например, если класс называется CRect, то конструктор этого класса обязан называться тоже CRect, а деструктор - ~CRect. Второе. В отличии от других методов конструктор и деструктор вызываются сами (а другие методы мы вызываем явным образом). Конструктор вызывается в момент создания экземпляра класса, а деструктор - в момент уничтожения. Т. е. их не надо вызывать явным образом - они вызываются сами. Именно поэтому конструкторы обычно используются для задания некоторых начальных значений для переменных класса, а деструкторы - для освобождения памяти (в случае если у вас есть внутри класса переменные-указатели). Третье. Ни конструктор, ни деструктор не возвращают никакого значения (даже типа void). Это означает, в частности, что при обяъвлении конструтора и деструктора в классе мы перед ними не пишем ни какой тип. Четвертое. В классе может быть несколько конструкторов (и они должны различаться параметрами), и только один деструктор (у него параметров вообще быть не может). Вот пример на все вышесказанное : class CRect { float m_a, m_b; //Стороны. public: //Конструкторы и деструктор. CRect(); // Конструктор без параметров. CRect(float a. float b); // Конструктор с двумя параметрами. ~CRect(); // Деструктор. ... }; ... // Реализация конструкторов и деструкторов. CRect::CRect() { // Задание стандартных (нулевых) значений. m_a = 0; m_b = 0; } CRect::CRect(float a. float b) { // Задание значений, задаваемых параметрами. m_a = a; m_b = b; } CRect::~CRect() { // Просто вывод некоторой надписи. cout<<"Destructor\n"; } А вот так можно использовать класс в функции main: void main() { //Использование класса. CRect r; // Вызов конструктора без параметров. cout<<"Perimeter = "<<r.GetPerim()<<"\n"; // Выведется 0. cout<<"Square = "<<r.GetSquare()<<"\n"; // Выведется 0. CRect r1(2, 3); // Вызов конструктора с параметрами. cout<<"Perimeter = "<<r1.GetPerim()<<"\n"; // Выведется 10. cout<<"Square = "<<r1.GetSquare()<<"\n"; // Выведется 6. // В этом месте вызовутся 2 деструктора - для переменных r и r1. // Соответственно, на консоль выведется два раза слово "Destructor". }
-
Разбор первого класса Итак разберем наш первый класс. Итак, для объявления класса мы используем следующую конструкцию: class MyClass { //Внутренность класса. }; Тут вместо MyClass мы можем написать, разумеется, любое имя. Обратите так же внимание на точку с запятой в конце класса - она обязательна. Объявление класса - это как бы конструирование нового типа данных. В C/C++ есть встроенные типы данных - int, char, float и другие. Но для реальной задачи удобнее создать свои типы, которые будет лучше моделировать поставленную задачу. Классы как раз для этого и предназначены. Теперь несколько слов о том, что может находиться внутри класса. А именно, там могут находиться переменные разных типов и функции (они же методы) класса. Переменные могут быть самых разных типов - в том числе и экземпляры других классов (и даже экземпляры того же самого класса). Вообще внутренность класса делится на 3 части - public (доступна всем), private (доступна только самому классу) и protected (доступна классу и его потомкам. Слово private можно не писать - оно действует по умолчанию. Т. е. наши переменные m_a и m_b нахадятся в private части класса: class CRect { float m_a, m_b; //Стороны. ... Зачем мы поместили m_a и m_b в private часть класса? Так как на их значения существуют ограничения - а именно они не могут быть отрицательные. Поэтому для доступа к этим переменным мы добавили по две функции GetA/B - для чтения и SetA/B - для записи: ... void SetA(float a); void SetB(float b); float GetA(); float GetB(); ... Эти функции мы объявили, разумеется, в public части класса. Обратите внимание, что функции мы только объявили, а реализацию функций мы пишем вне класса: ... void CRect::SetA(float a) { if(a>0) { m_a = a; } else { m_a = 1; } } ... При этом мы перед именем функции пишем обязательно имя класс с двойным двоеточием (для того, что бы показать, что эта функция именно из нашего класса): void CRect::SetA(...) ... Функции SetA/B мы написали так, что они позволяют записать только положительно значение. Если в такую функцию мы передадим для стороны отрицательное значение, то запишется не оно, а единица. С функциями, вычисляющими площадь, периметр и выясняющими, не есть ли наш прямоугольник квадратом, тоже все ясно - они используют соответствующие формулы из математики и возвращают нужное значение посредством return. В функции main мы создаем экземпляр нашего класса: void main() { //Использование класса. CRect r; ... и затем с этим экземпляром работаем - устанавливаем для него значения сторон A и B, считаем периметр и др.: ... r.SetA(5); r.SetB(3); cout<<"Perimeter = "<<r.GetPerim()<<"\n"; cout<<"Square = "<<r.GetSquare()<<"\n"; ... Обратите внимание, что функции мы вызываем не сами по себе, а именно для нашего экземпляра класса r. Синтаксис тут такой: имя экземпляра, точка, имя функции: r.SetA(5); Можно в программе объявить несколько экземпляров класса или даже массив: CRect w, v; CRect z[5]; Все такие экземпляры будут независимы друг от друга.
-
Классы В ранее мы рассматривали структуры. Классы чем-то напоминают структуры - у них также внутри есть переменные разных типов. Но наряду с этими переменными у класса есть и несколько отличий, которые мы сейчас и рассмотрим на примере. Вот пример класса: #include <iostream.h> //Объявление класса прямоугольника. class CRect { float m_a, m_b; //Стороны. public: //Методы класса. //Методы по чтению и записи сторон. void SetA(float a); void SetB(float b); float GetA(); float GetB(); float GetSquare(); //Площадь. float GetPerim(); //Периметр. bool IsSquare(); //Не является ли прямоульник квадратом. }; //Точка с запятой обязательна! void main() { //Использование класса. CRect r; r.SetA(5); r.SetB(3); cout<<"Perimeter = "<<r.GetPerim()<<"\n"; cout<<"Square = "<<r.GetSquare()<<"\n"; if(r.IsSquare()) { cout<<"Square\n"; //Квадрат. } else { cout<<"Not a quare\n"; //Не квадрат. } } //Реализация методов класса. //Методы по чтению и записи сторон. void CRect::SetA(float a) { if(a>0) { m_a = a; } else { m_a = 1; } } void CRect::SetB(float b) { if(b>0) { m_b = b; } else { m_b = 1; } } float CRect::GetA() { return m_a; } float CRect::GetB() { return m_b; } //Площадь. float CRect::GetSquare() { return m_a*m_b; } //Периметр. float CRect::GetPerim() { return (m_a+m_b)*2; } //Не является ли прямоульник квадратом. bool CRect::IsSquare() { return (m_a==m_b); } После запуска программы выведет, что периметр равен 16, площадь - 15 и что это - не квадрат. Этого, собственно, и следовало ожидать. Как вы видите, у класса есть несколько особенностей. Во-первых, у него есть функции (вообще говоря, те функции, которые принадлежат классу, называются методами). Во-вторых, его части имеют разный тип доступа (у нас это public и private (последний тип доступа является типом доступа по умолчанию и слово private можно не писать, что мы и сделали для переменных m_a и m_b)). В методе main мы создали так называемый экземпляр класса (с именем r) - можно считать, что это конкретный прямоугольник. Экземпляр класса объявляется аналогично объявлению обычной переменной. Потом мы в main вызываем функции (методы) класса для нашего экземпляра r.
-
Павловская Т.А С С++. Структурное программирование Практикум В практикуме на примерах рассматриваюстя средства С++, используемые в рамках сруктурной парадигмы: стандартные типы данных, основные конструкции, массивы, строки, структуры, фукнции, шаблоны, динамические структуры данных. Обсуждаются алгоритмы, приемы отладки, вопросы качества и стиля. По каждой теме приведено несколько комплектов из 20 вариантов заданий. Допущено Министерством образования Российской Федерации в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению "Информатика и вычислительная техника" Павловская Т.А С С++. Структурное программирование Практикум.rar
-
Параметры командной строки В программу могут передаваться параметры командной строки. Несколько примеров таких программ - это команда ping (в качестве параметра выступает ip-адрес компьютера, с которым вы хотите проверить связь), команда copy (в качестве параметра выступают имя компируемого файла и новое местоположение и имя). Для работы с параметрами командной строки мы должны добавить два параметра в функцию main. Первый параметр задает общее количество передаваемых в программу параметров (при этом имя самого exe-файла тоже считается параметром), второй - сами параметры. Вот пример функции, которая выведет все свои параметры командной строки: #include <iostream.h> void main(int argc, char* argv[]) { for(int i=0; i<argc; i++) { //Выводим имя exe-файла //и все параметры командной строки. cout<<argv<<"\n"; } } Тут первый параметр: argc - это общее количество параметров. При простом запуске программы (например, простым щелчком на exe-файле) он будет равен 1. Второй параметр представляет из себя массив типа char*. Тип char* - это указатели на символ, который интерпретируется как строка. Нулевой элемент в этом массиве строк - это имя самого exe-файла, первый - это первый передаваемый параметр, второй - второй передаваемый параметр (разумеется, если эти параметры вообще есть). В средах разработки часто существует возможность задать параметры командной строки в самой IDE. Вот так, например, это делается в Visual C++.NET. Из контесктного меню для проекта выбираем Properties: затем в появившемся окне Property Pages в разделе Debugging задаем Command Arguments: Откомпилируем и запустим нашу программу из командной строки с параметрами. Результат будет приблизительно такой:
-
Герб Саттер Новые сложные задачи на C++ Данная книга представляет собой продолжение вышедшей ранее книги Решение сложных задач на C++. В форме задач и их решений рассматриваются современные методы проектирования и программирования на C++. В книге сконцентрирован богатый многолетний опыт программирования на C++ не только самого автора, но и всего сообщества программистов на C++, так что некоторые рекомендации автора могут показаться неожиданными даже опытным программистам-профессионалам. Автор рассматривает и конкретные методики, приемы и идиомы программирования, однако основная тема книги - это стиль программирования, причем в самом широком понимании этого слова. Особое внимание во всех задачах книги уделено вопросу проектирования, которое должно обеспечить максимальную надежность, безопасность, производительность и сопровождаемость создаваемого программного обеспечения. Книга рассчитана в первую очередь на профессиональных программистов с глубокими знаниями языка, однако она будет полезна любому, кто захочет углубить свои знания в данной области. Герб Саттер Новые сложные задачи на C++.rar
-
Объектно-ориентированное программирование в С++ Благодаря данной электронной книге тысячи пользователей овладели технологией объектно-ориентированного программирования в C++. В ней есть все: основные принципы языка, готовые полномасштабные приложения, небольшие примеры, поясняющие теорию, и множество полезных иллюстраций. Электронная книга пользуется стабильным успехом в учебных заведениях потому, что содержит более 100 упражнений, позволяющих проверить знания по всем темам. Читатель может вообще не иметь представления о C++. Необходимо лишь знание начальных основ программирования. Объектно-ориентированное программирование в С++.rar
-
Шаблоны функций Шаблоны служат для ситуции, когда у нас есть разные типы данных, с которыми мы должны работать по одному, не зависящему от этих типов данных, алгоритму. Например, метод сортировки массива не зависит от типов данных - такой алгоритм будет одинаков и для, например, чисел типа int и для чисел типа float. Приведем пример использования шаблона. Вот код для простейшего щаблона функции, которая из двух передаваемых в нее параметров возвращает максимальный: #include <iostream.h> //Объявление шаблона функции. template <class T> T max(T a, T b) { if(a>b) { return a; } else { return b; } } void main() { //Использование шаблона функции для целых. int x = 45, y = 32; cout<<max(x, y)<<"\n"; //Выведется 45. //Использование шаблона функции для вещественных. float s = 4.18, t = 34.08; cout<<max(s, t)<<"\n"; //Выведется 34.08. } Обратите внимание на синтаксис. Сначала мы пишем ключевое слово template и задаем формальный тип T (T - это просто произвольное имя): template <class T> ... Далее мы пишем непосредственно функцию, причем в качестве типа параметров и возвращаемого значения пишем введенный ранее формальный тип T: T max(T a, T b) ... Разумеется, количество параметров может быть любое и не все из них должны иметь тип T. То же относится и к типу возвращаемого значения - в нашем случае это тот же тип T, но в принципе тип может быть любой, хоть void. Также обратите внимание, что заданием формального параметра и объявлением класса не должно быть никаких операторов. Теперь пара слов о использовании шаблона. При использовании мы просто пишем имя функции (в нашем случае это max) с параметрами конкретных типов (int и float в нашем примере). Компилятор в этом месте сам сгенерирует на основании этого шаблона функцию с параметрами конкретных типов. Шаблоны существую не только для функций, но и для классов. Такие шаблоны мы рассмотрим позже.
-
Герб Саттер Решение сложных задач на С++ В данном издании объединены две широко известные профессионалам в области программирования на C++ книги Герба Саттера Exceptional C++ и More Exceptional C++ , входящие в серию книг C++ In-Depth, редактором которой является Бьерн Страуструп, создатель языка C++. Материал этой книги составляют переработанные задачи серии Guru of the Week, рассчитанные на читателя с достаточно глубоким знанием C++, однако книга будет полезна каждому, кто хочет углубить свои знания в этой области. Герб Саттер Решение сложных задач на С++.rar
-
Рекурсивные функции Функция может вызывать сама себя. Т. е. внутри функции мы используем ее саму. Вот классический пример - вычисление факториала (факториал n (обозначается как n!) - это произведение целых чисел от 1 до n. Например, 4!=24 (1*2*3*4)): //Объявление функции. int fact(int n) { if(n>1) { //Вызываем функцию из себя самой. return n*fact(n-1); } else { //Факториал 1 равен 1. return 1; } } void main() { //Вызов функции. cout<<fact(5); } Обратите внимание, что функция внутри себя считается уже объявленной и ее можно использовать. Указанный фрагменты выведет, естественно, 120 (1*2*3*4*5).
-
Брайан Оверленд C++ без страха В большинстве книг по программированию на языке C++ предполагается, что читатель уже программировал на другом языке, а еще лучше на нескольких. Эту книгу можно читать с нуля. Книга содержит большое количество примеров программного кода. Все примеры записаны на прилагаемый к книге компакт-диск, чтобы читатель мог активизировать полученные знания, каждый пример сопровождается рядом упражнений. Выполнив их, вы научитесь думать как программист и станете настоящим асом программирования С++. Автор книги Брайан Оверленд на протяжении десяти лет работал в компании Microsoft программистом, руководителем проектов и писателем - уникальная комбинация, которая позволила написать множество понятных и точных книг по программированию. Брайан Оверленд C++ без страха.rar
-
Случайные числа Для получения случайных чисел служит функция rand(). Параметров у нее нет. Она возвращает случайное число от 0 до значения констаны RAND_MAX. Как правило, эта константа равна 32767 (2 в 15-степени минус 1). Функция rand() (как и константа RAND_MAX) описана в файле stdlib.h, так что не забудьте подключить его: #include <stdlib.h> Вот пример использования функции rand(): int k; k=rand(); Обратите внимание, что функция rand() будет постоянно возвращать одну и ту же последовательность случайных чисел. Это очень удобно на этапе отладки программы - если программа выдает ошибку, то эту ошибку легче воспроизвести при одних и тех же случайных числах. Реальная же программа должна, как правило, возвращать разные последовательности случайных чисел. Это делаем через функцию srand, которая принимает целый параметр, определяющий, какая конкретно последовательность случайных чисел у нас будет выдаваться функцией rand. Функцию srand достаточно вызвать только один раз в начале программы. Правда, в srand мы должны в качестве параметра подставить случайное число, но его можно получить, например, из текущего времени. Вот пример: #include <time.h> ... srand((unsigned)time(NULL)); cout<<rand()<<"\n";
-
Стефан К. Дьюхэрст Скользкие места C++ Вы держите в руках руководство по тому, как не допускать и исправлять 99% типичных, разрушительных и просто любопытных ошибок при проектировании и реализации программ на языке C++. Эту электронную книгу можно рассматривать также, как взгляд посвященного на нетривиальные особенности и приемы программирования на C++. Обсуждаются как наиболее распространенные «ляпы», имеющиеся почти в любой программе па C++, так и сложные ошибки в использовании синтаксиса, препроцессора, преобразований типов, инициализации, управления памятью и ресурсами, полиморфизма, а также при проектировании классов и иерархий. Все ошибки и их последствия обсуждаются в контексте. Подробно описываются способы разрешения указанных проблем. Автор знакомит читателей с идиомами и паттернами проектирования, с помощью которых можно решать типовые задачи. Читатель также узнает много нового о плохо понимаемых возможностях C++, которые применяются в продвинутых программах и проектах. В электронной книге рассказывается, как миновать наиболее серьезные опасности, подстерегающие программиста на C++. Программисты найдут в ней практические рекомендации, которые позволят им стать настоящими экспертами. Издание предназначено для всех программистов, желающих научиться писать правильные и корректно работающие программы на языке C++. Стефан К. Дьюхэрст Скользкие места C++.rar
-
Работа со строками Вообще говоря в C/C++ нет строкового типа. Его роль выполняет либо указатель на char, либо массив char'ов. Для работы с такими строками в C++ есть несколько функций, тиена которых начинаются на str. Вот пример их использования: #include <iostream.h> #include <string.h> void main() { char* ch="Roman"; char ch1[30]; //Показывем длину строки cout<<strlen(ch)<<"\n"; //Копируем строку strcpy(ch1, ch); cout<<ch1<<"\n"; //Длина скопированной строки такая же, как и у старой cout<<strlen(ch1)<<"\n"; //Сравнение строк if(strcmp(ch, "Roma")==0) { cout<<"Strings are equal\n"; } else { cout<<"Strings are not equal\n"; } //Конкатенация (сложение) строк strcpy(ch1, "Roman"); strcat(ch1, " Alexeev"); //Выведется "Roman Alexeev" cout<<ch1<<"\n"; } Для использования таких функций мы должны написать соответствующий include: ... #include <string.h> ... Пару слов следует сказать о функции strcmp. Она возвращает ноль, если строки равны; отрицательное число, если строка, задаваемая первым параметром, расположена в алфавитном порядке раньше строки, задаваемой вторым параметром; и положительное число, если первая строка расположена в алфавитном порядке дальше, чем вторая.
-
Дейтел Х.М. Как программировать на С++ Книга предлагает читателю курс программирования, ориентированный на языки C/C++, и рассчитана как на начинающих, не владеющих никакими языками программирования, так и на опытных программистов, которые могут просто пропустить не интересующие их главы. Помимо достаточно полного и глубокого изложения языка С дается весьма серьезное введение в C++, одного из наиболее перспективных на настоящий момент языков; ему посвящена значительная часть книги. Особое внимание уделяется методикам структурного и объектно-ориентированного программирования больших программных систем. Примеры и многочисленные упражнения знакомят читателя с часто применяемыми алгоритмами и фундаментальными структурами данных, показывая технические приемы их реализации. Приводится также масса полезных советов. Книга адресована широкому кругу читателей, от новичков до студентов, изучающих программирование в рамках своей специальности. Дейтел Х.М. Как программировать на С++.rar
-
Оператор sizeof Оператор sizeof позволяет выяснить, сколько байт занимает тот или иной тип. В качестве параметра он принимает или название типа, или переменную соответствующего типа. Вот пример: int z; cout<<sizeof(int)<<"\n"; //Выведется 4. cout<<sizeof(z)<<"\n"; //Выведется 4. Параметр может быть не только встроенным типом. Пример со структурой: struct vector { float x; float y; }; void main() { vector s; cout<<sizeof(s)<<"\n"; //Выведется 8. } Пример выведет 8, так как float занимает 4 байта и в нашей структуре 2 переменной типа float.
-
Стивен Дьюхерст C++ Священные знания Стивен Дьюхерст, эксперт по С++ с более чем 20-летним опытом применения С++ в различных областях, рассматривает важнейшие, но зачастую неправильно понимаемые темы программирования и проектирования на С++, отсеивая при этом ненужные технические тонкости. В один тонкий том Стив уместил то, что он и его рецензенты, опытные консультанты и авторы, считают самым необходимым для эффективного программирования на С++. Книга адресована тем, кто имеет опыт программирования на С++ и испытывает необходимость быстро повысить свое знание С++ до профессионального уровня. Издание полезно и квалифицированным программистам на С или Java, имеющим небольшой опыт проектирования и разработки сложного кода на С++ и склонных программировать на С++ в стиле Java. Стивен Дьюхерст C++. Священные знания.rar
-
Стивен Дьюхерст C++ Священные знания Стивен Дьюхерст, эксперт по С++ с более чем 20-летним опытом применения С++ в различных областях, рассматривает важнейшие, но зачастую неправильно понимаемые темы программирования и проектирования на С++, отсеивая при этом ненужные технические тонкости. В один тонкий том Стив уместил то, что он и его рецензенты, опытные консультанты и авторы, считают самым необходимым для эффективного программирования на С++. Книга адресована тем, кто имеет опыт программирования на С++ и испытывает необходимость быстро повысить свое знание С++ до профессионального уровня. Издание полезно и квалифицированным программистам на С или Java, имеющим небольшой опыт проектирования и разработки сложного кода на С++ и склонных программировать на С++ в стиле Java.
-
Преобразование типов Преобразование типов - это приведение (превращение) одного типа в другой. Такое преобразование созможно далеко не всегда. А иногда в нем вообще нет особой необходимости - например, когда вы присваиваете переменной типа float значение переменной типа int - тут нет никакой потери точности, так что компилятор даже не выдаст вам предупреждения. А вот, например, обратный пример: ... int a; float b=2.78; ... a=b; //Потеря точности! Тут мы в переменную типа int записываем значение переменной типа float. Синтаксической ошибки не будет, но скорей всего компилятор выдась предупреждение о возможной потери точности. Для того, чтобы компилятор не ругался, мы сделаем преобразование типа float к типу int. Вот так: ... a=(int)b; ... Этот случай достаточно очевидный - мы преобразуем один числовой тип к другому. А вот так, например, можно преобразовать тип char к типу int или наоборот: ... char ch='A'; //Выведется 65 - код символа 'A'. cout<<(int)ch; int a=7; //Раздастся звонок (код 7). cout<<(char)a; ... На самом деле такое преобразование будет возможно, так как char - это тоже целочисленный тип как и int.
-
Сабуров С. В. Языки программирования C и C++ В книге («неофициальное» руководство пользователя) полностью описаны языки программирования C и С++. Уделено особое внимание описанию языка C++ и интегрированных средах разработки программ TURBO C++ и Visual C. Язык программирования C++ — это C, расширенный введением классов, inline-функций, перегруженных операций, перегруженных имен функций, константных типов, ссылок, операций управления свободной памятью, проверки параметров функций. Этот язык, сохранив средства ставшего общепризнанным стандартом для написания системных и прикладных программ языка С (процедурно-ориентированный язык), ввел в практику программирования возможности нового технологического подхода к разработке программного обеспечения, получившего название «объектно- ориентированное программирование». Языки программирования C и C++ - Сабуров С.В.rar
-
Указатели Указатель - одно из важных понятий языка C/C++. Начинающие программисты поначалу путаются, но со временем все должно встать на свои места. Итак, каждая переменная имеет свой адрес в адресном пространстве. Так вот, указатель - это переменная, которая хранит адрес другой переменной. Т. е. если в переменной обычного типа хранится, например, целое число, то в переменной-указателе может храниться адрес переменой, в котрой хранится целое число. Все это справедливо, разумеется, не только для целого типа, но и любого другого. Указатели различаются по типам. Например, указатель на целое может хранить адрес переменной целого типа, а указатель на тип float - адрес переменной типа float. Указатель на определенный тип объявляем так: сначала пишем этот тип, потом пишем звездочку и затем произвольное имя переменной. Пример: int * p1; // Указатель на целое. bool * p2; // Указатель на тип bool. Так же как и для переменных обычного типа для переменных типа указатель мы при объявлении имеем в такой переменной мусор - т. е. некотрый непонятный адрес. Существует два способа записи инициализации указателя - записать в него адрес существующей переменной соответствующего типа или выделить новый участок памяти через ключевое слово new. Вот пример на первый способ: int z=20; int *p=&z; Тут мы в указатель p записали адрес переменной z. А вот пример на второй способ инициалиазации указателя - через ключевое слово new: int *p=new int; В этом случае мы говорим, что память у нас выделена динамически. Синоним этого - память выделена в куче (heap). В противоположность этому память для переменных обычного типа (не указателей) выделяется в стеке. И в первом, и во втором способах в переменной p будет храниться указатель (адрес) целого типа. Для того, чтобы через этот адрес работать с тем местом, на котрое он указывает (т. е. в нашем случае с некоторым целым числом), мы используем так называемое разыменование указателя. Вот пример: ... *p=123; //Записываем 123 в место, на которое указывает указатель p. cout<<p<<"\n"; //Выведется некий адрес (например, 0x0012FF7C) cout<<*p<<"\n"; //Выведется 123; Т. е. для доступа к тому месту, на которое указывает указатель, мы перед его именем добавляем звездочку. Таким образом по сути разыменование указателя - это доступ к тому месту на которое указатель указывает. Для указателей существует некий аналог нуля - это значение NULL. Вот пример: int *p=NULL; На самом деле NULL определена как 0, поэтому в большинстве способов можно писать 0 вместо NULL.