Страница 1 из 1

Шпора по С++

Добавлено: 05 май 2017, 05:46
admin
Недостаток процедурно-ориентированных (Паскаль, С, Fortran) языков
1. Неограниченность доступа функций к глобальным данным.
2. Данные и функции в проекте "географически" находятся в разных местах, что плохочитабельно и не отображает картину "реального мира"

Объекто ориентированное программирование
Пример описания реального мира:
Свойства объекта <=> характеристика объекта (для людей - цвет глаз, рост, вес, возраст и тп., для машин - марка, мощность, тип двигателя и пр)
Поведение <=> реакция объекта на воздействие (нажали на тормоз, машина остановилась; спросили у боса о повышени, он ответил "да" или "нет")- функция (МЕТОДЫ В С++)
Объект = свойства объекта (характеристика объекта) + поведение ( реакция на воздействие (функция, методы)) - объектно ориентированное программирование.

ОБЪЕКТ, КЛАСС, ЭКЗЕМПЛЯР.
Таким образом класс - это шаблон, а экземпляр класса - конкретная реализация шаблона. А вот уже экземпляры класса являются объектами, то есть конкретными элементами, хранящими конкретные значения.
экземпляр класса <=> объект.

Пример программы:

Код: Выделить всё

class MyClass		//определение класса
 {
	 private:		//приватные данные/функции, скрытые данные/функции, нельзя изменить, нет прямого доступа, только из метода (функции) данного класса
		int somedata; 	//поле данных класса, член класса, описание класса, данные класса, которые нельзя изменить прямым доступом
						//"глобальные переменные" класса, необходимые при работе с методами (функциями) данного класса
	 
	 public:		//общедоступные данные/функции, общее, есть доступ
		void setdata (int d) //метод класса, функция изменяющая значение поля данных класса
			{somedata=d;}
		
		void showdata()		//метод класса, функция отображающая значение поля данных класса
			{count<<"Значение поля равно "<<somedata<<endl}
 };
/////////////////////////////////////////////////////
 int main ()
 {
	 MyClass s1,s2;    	//определение двух объектов класса MyClass s1 и s2 (экземпляров класса MyClass)
	 
	 s1.setdata (901); 	//вызов метода setdata(int d) класса MyClass объектом класса s1 => d=901 => somedata=901 в объекте класса s1     
	 s2.setdata (101); 	//вызов метода setdata(int d) класса MyClass объектом класса s2 => d=101 => somedata=101 в объекте класса s2
	 
	 s1.showdata();  	//вызов метода showdata() класса MyClass объектом s1 => "Значение поля равно 901"
	 s2.showdata();		//вызов метода showdata() класса MyClass объектом s2 => "Значение поля равно 101"
	 return 0; 
 }


ИНКАПСУЛЯЦИЯ
Если необходимо считать или изменить какие-либо данные объекта, нужно вызвать соответствующий метод (может быть несколько), который выполнит считывание/изменение и возвратит требуемое значение. Прямой доступ к данным невозможен! Это и есть ИНКАПСУЛЯЦИЯ!
Типичная программа на с++ состоит из большого количества объектов взаимодействующих между собой посредствам вызова методов (функций) друг друга, так как прямой доступ к данным объекта невозможен.

НАСЛЕДОВАНИЕ
Подкласс (производные класса)=свойства класса (базовый класс)+собственные свойства подкласса (производные класса)

Код: Выделить всё

 class CountDn : public Counter
class CountDn - наследник класса Counter, подкласс, потомок.
: - наследование
public Counter - базовый класс, надкласс, родитель.

КОНСТРУКТОР
Предназначен для инициализации поля данных объектов класса при создании объекта класса. Имя конструктора должно в точности совпадать с именем класса!
У конструктора нет возвращаемого значения! стр 227
Пример:

ДЕСТРУКТОР
Вызывается при уничтожении объекта класса. Необходим для освобождения памяти выделенной конструктором. Имеет такое же имя как и конструктор, сопровождаемое "~"

ВНЕШНЯЯ ФУНКЦИЯ КЛАССА, ОПРЕДЕЛЕНИЕ ФУНКЦИИ ВНЕ КЛАССА.

Код: Выделить всё

 void Distance::add_dist(Distance d2, Distance d3)

void - возвращаемый тип объекта класса
Distance - имя класса
:: - операция глобального разрешения, разрешает определение метода (функции) вне класса
add_dist - имя функции
Distance d2, Distance d3 - аргументы функции


PUBLIC, PROTECTED,PRIVATE

Код: Выделить всё

 
|Снецификатор|Доступ из класса|Доступ из производных класса|Доступ из внешних классов и функций|
	public:		Есть					Есть							Есть		
	protected:	        Есть					Есть							Нет
	private: 		Есть					Нет							Нет


АДРЕСА И УКАЗАТЕЛИ
& - ссылка на переменную в аргументах функции, используется если из функции надо возвратить несколько значений
& - адрес переменной
указатель - переменная хранящая в себе значение адреса
int* iptr - указатель на целую переменную, класс,
iptr=&var1 - помещаем в переменную iptr адрес переменной var1
var2=*iptr - взять значение переменной на которую указывает указатель

УПРАВЛЕНИЕ ПАМЯТЬЮ "new" и "delete"
new - универсальная операция, получающая память у операционной системы и возвращающая указатель на начало выделенного блока.
delete - освобождает выделенный участк памяти, возвращая его операционной системе
-> - операция используемая для доступа к методам объекта, созданного с помощью оперции new

Re: Шпора по С++

Добавлено: 02 дек 2017, 16:33
admin
Класс в языке C++ создаётся следующим образом:

Код: Выделить всё

  class MyClass: public ParentClass // ParentClass — класс-предок, если таковой имеется
  {
      public:
         // элементы в этой секции доступны из любой части программы
         MyClass(); // конструктор
         ~MyClass(); // деструктор
      protected:
         // элементы в этой секции доступны из класса и его потомков
      private:
         // элементы в этой секции доступны только из класса; это область доступа по умолчанию
  };
После своего создания класс считается полноценным типом данных и, следовательно экземпляры класса создаются следующим образом:

Код: Выделить всё

  MyClass myinstance;
Обращение к членам класса:

Код: Выделить всё

  myinstance.classmember
Уничтожается экземпляр класса, как и любая переменная, только в случае, если функция, в которой он был создан, завершила работу или если была принудительно освобождена динамическая память, выделенная под класс.

Re: Шпора по С++

Добавлено: 10 дек 2017, 12:08
admin

Код: Выделить всё

//подключили библиотеку <conio.h>
#include <conio.h> 
// подключили стандартную библиотеку С++, по этому без ".h"
#include <iostream> 

using std::count; //using - директива (команда), объявляет объект  count в пространстве имён std. Пространство имён - для разрешения проблеммы конфликта имён. Москва и Магнитогорск, ул Ленина, но города (пространство имён) разные. std - стандартное пространство имён.
using std::endl;

int main () // int -  для хранения в программе целого числа, отвечает за "число" в return
			// main - главная функция, зарезервировани стандартом
			//() - параметры данной функции (пример "CD C:\", "CD" - запускаемая программа "C:\" - параметр переданный в функцию)

	{			//{} - тело функции, блок операторов
	cout<<"Hello World!"<< endl;// оператор вывода в поток
		
	return 0;	// return 0; - оператор, который возвращает значение операционной системе. Если возвращается "0" то программа оспешно завершена, другое значение - ошибка.
	}

Re: Шпора по С++

Добавлено: 09 дек 2020, 22:15
admin
Ключевое слово this
В переменной с этим именем хранится адрес текущего объекта, т. е. объекта, с которым в данном месте программы происходит работа. Этот элемент введен в язык для разрешения неоднозначных ситуаций, когда, например, вы в конструкторе назвали параметр таким же именем, как поле. Формально компилятор пропустит этот вариант, но при выполнении программы можно получить не тот результат. Чтобы в таких случаях различать, какая переменная к чему относится при одинаковых именах, и введено это ключевое слово.
Например, в случае нашего примера мы могли бы определить заголовок конструктора как

Код: Выделить всё

 public MyCar(string name, int Speed, string Owner_name)
Здесь первый параметр по имени совпадает с именем поля класса. По этому в теле конструктора мы вынуждены записать строку

Код: Выделить всё

{ 
  name=name; 
  ... 
} 
Компилятор посчитает, что строка присваивается самой себе, и полю name класса ничего не присвоит. Поэтому в таких ситуациях надо ис- пользовать слово this, которое в данном случае подскажет компилято- ру, что name в левой части от знака присвоения принадлежит текущему объекту, а именно тому, который создается из класса, а не конструкто- ру. В этом случае конструктор будет выглядеть так:

Код: Выделить всё

public MyCar(string name, int Speed, string Owner_name) 
{ 
  this.name=name; 
  speed=Speed; 
  owner_name=Owner_name; 
} 

Re: Шпора по С++

Добавлено: 14 фев 2021, 14:15
admin
Для отображения русских символов в командной строке необходимо в начале основной функции main() добавить:

Код: Выделить всё

setlocale(LC_ALL, "Russian");

Re: Шпора по С++

Добавлено: 14 фев 2021, 14:37
admin
this - указатель, содержащий адрес объекта, который вызвал данный метод/функцию.

Re: Шпора по С++

Добавлено: 14 фев 2021, 18:14
admin
Указатель – это переменная, значением которой служит адрес участка памяти, выделенной для объекта конкретного типа. Поддерживает арифметические и пр. операции.
Ссылка – представляют собой видоизменённую форму указателя, которая используется в качестве псевдонима (другого имени) переменной, всегда указывает на тот объект, к которому была привязана при ее инициализации.

Взято тут