Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Управляемый код. Осознать разницу

Читайте также:
  1. ВЕЩЬ И ВРЕМЯ: УПРАВЛЯЕМЫЙ ЦИКЛ
  2. Кальность как разницу в уровне и в способе взаимоотношений с Богом, а не
  3. Ни звука. Ни вздоха. И не только моего. На какой-то момент отсутствие боли стало единственным, что я смогла осознать.
  4. Почему ложь? Если я нигде, как я могу что-то постичь? Чтобы осознать что-то, должен быть кто-то, кто осознает. Если я ничто, если я нигде, как могу я постичь что-то?
  5. Синтаксически управляемый перевод
  6. Укажите разницу между страховым возмещением и страховым обеспечением

Первый шаг тривиален. Создается C++ Win32 Console Project, то есть Неуправляемое Консольное Приложение на C++. Последняя версия Visual Studio.NET 2005 позволяет в широких пределах смешивать управляемый и неуправляемый коды.

// Транслятору задали опцию /clr. // Эта опция преобразует все объявляемые в программе типы. // От имени объекта элементарного типа (например, int) можно // вызвать методы базового класса object. // Но только вызываются они лишь из фрагментов управляемого кода. // Иначе – сообщение транслятора: //... managed type or function cannot be used in an unmanaged function #include "stdafx.h" #include <iostream> using namespace std; #using <mscorlib.dll> // Ядро CLRusing namespace System; class uClass; // Предварительное неполное объявление класса. class mClass; // Предварительное неполное объявление класса. #pragma managedclass mClass { public: uClass *ucP; mClass *mcP; int x; mClass() { // Только в неуправляемом коде! // cout << "Ha-Ha-Ha"; Console::WriteLine("mClass"); // Легко посмотрели значение непроинициализированной переменной. Console::WriteLine(x.ToString()); } ~mClass() { Console::WriteLine("~mClass"); } void mcF0() { Console::WriteLine("mcF0()"); } mClass* mcGenerator(); }; #pragma unmanaged class uClass { public: uClass *ucP; mClass *mcP; int x; uClass() { // Только в управляемом коде! //Console::WriteLine("Ha-Ha-Ha"); printf("uClass\n"); } ~uClass() { printf("~uClass\n"); } void ucF0() { cout << "ucF0()\n"; } uClass* ucGenerator(); }; // Судя по всему, функция Управляемого // класса может быть НеУправляемой! mClass* mClass::mcGenerator() { //x.ToString(); //Console::WriteLine("Ha-Ha-Ha"); cout << "Ha-Ha-Ha from unmanaged function of managed class!" << endl; ucP = new uClass(); ucP->ucF0(); delete ucP; return new mClass(); } #pragma managed // А сделать Управляемой функцию НеУправляемого класса невозможно. // Прагма managed для функции - члена неуправляемого класса игнорируется. uClass* uClass::ucGenerator() { cout << "Ha-Ha-Ha from function of unmanaged class!" << endl; //Console::WriteLine("Ha-Ha-Ha"); //x.ToString(); mcP = new mClass(); mcP->mcF0(); delete mcP; return new uClass(); } #pragma unmanaged int _tmain(int argc, _TCHAR* argv[]) { void *xPoint; int x = 125; // Только не смешивать! //Console::WriteLine("Ha-Ha-Ha"); mClass *mc = new mClass(); mc->mcF0(); xPoint = mc->mcGenerator(); delete (mClass*)xPoint; delete mc; uClass *uc = new uClass(); uc->ucF0(); xPoint = uc->ucGenerator(); delete (uClass*)xPoint; delete uc; return 0;

 

 

42.Файловый ввод-вывод с использованием потоков
Для осуществления операций с файлами предусмотрено три класса: ifstream, ofstream и fstream. Эти классы являются производными, соответственно, от классов istream, ostream и iostream. Поскольку эти последние классы, в свою очередь, являются производными от класса ios, классы файловых потоков наследуют все функциональные возможности своих родителей (перегруженные операции «и» для встроенных типов, функции и флаги форматирования, манипуляторы и пр.). Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл fstream.h.
Существует небольшое отличие между использованием предопределенных и файловых потоков. Файловый поток должен быть связан с файлом прежде, чем его можно будет использовать. С другой стороны, предопределенные потоки могут использоваться сразу после запуска программы, даже в конструкторах статических классов, которые выполняются даже раньше вызова функции main(). Можно позиционировать файловый поток в произвольную позицию в файле, в то время как для предопределенных потоков это обычно не имеет смысла.
Для создания файлового потока эти классы предусматривают следующие формы конструктора:
создать поток, не связывая его с файлом:
ifstream();

ofstream();

fstream();
создать поток, открыть файл и связать поток с файлом:
ifstream(const char *name, ios::openmode mode = ios::in);

ofstream(const char* name, ios::openmode mode=ios::out | ios::trunc);

fstream(const char * name, ios::openmode mode = ios::in | ios::out);
Чтобы открыть файл для ввода или вывода, можно использовать вторую форму нужного конструктора
fstream fs("FileName.dat");
или вначале создать поток с помощью первой формы конструктора, а затем открыть файл и связать поток с открытым файлом, вызвав функцию-член open(). Эта функция определена в каждом из классов потокового ввода-вывода и имеет следующие прототипы:
void ifstream::open(const char *name, ios::openmode mode = ios::in);

void ofstream::open

(const char * name, ios::openmode mode = ios::out | ios::trunc);

void fstream::open

(const char * name, ios::openmode mode = ios::in | ios::out);
Здесь name - имя файла, mode - режим открытия файла. Параметр mode является перечислением и может принимать значения, указанные в табл. 8.
Таблица 8
Режимы открытия и их назначение

Режим открытияНазначениеios::inОткрыть файл для чтенияios::outОткрыть файл для записиios::ateНачало вывода устанавливается в конец файлаios::appОткрыть файл для добавления в конецios::truncУсечь файл, то есть удалить его содержимоеios::binaryДвоичный режим операций

 

43. Функции-друзья
Если программа использует друзей для доступа к частным данным класса, вы можете ограничить количество функций-элементов класса-друга, который может обращаться к частным данным, используя дружественные функции. Для объявления функции-друга укажите ключевое слово friend, за которым следует полный прототип, как показано ниже:

public:
friend class_name::function_name(parameter types);

Только функции-элементы, указанные как друзья, могут напрямую обращаться к частным элементам класса, используя оператор точку.

 

44.Явное и неявное преобразование типов.

В C++ различают явное и неявное преобразование типов данных. Неявное преобразование типов данных выполняет компилятор С++, ну а явное преобразование данных выполняет сам программист. О преобразовании типов данных скажу следующее: «Результат любого вычисления будет преобразовываться к наиболее точному типу данных, из тех типов данных, которые участвуют в вычислении». Для наглядного примера представлю таблицу с преобразованиями типов данных. В таблице рассмотрим операцию деления. В качестве целочисленного типа данных возьмем int, ну и вещественный тип данных у нас будет float.

x y Результат деления Пример
делимое делитель частное x = 15 y = 2
int int int 15/2=7
int float float 15/2=7.5
float int float 15/2=7.5

Из таблицы видно, что меняя переменные различных типов данных местами, результат остается тот же (в нашем случае это делимое и делитель). О неявном преобразовании типов данных все, что же касается явного преобразования, то оно необходимо для того чтобы выполнять некоторые манипуляции, тем самым меняя результата вычисления. Самый простой способ явного преобразования типов данных, пример: допустим нам необходимо разделить такие числа 15 и 2, делим! 15/2=7. Результат тот же, что и в таблице. Но если сделать незначительные преобразования, например: 15.0/2=7.5 при таком делении число 15 является вещественным, значит и результат будет вещественный. Само число 15 с точки зрения математики не изменилось, ведь 15=15.0. Этот же прием можно было применить к двойке, результат был бы тем же, а можно было сразу к двум числам, но зачем,если хватает одного из двух.

 


Дата добавления: 2015-11-14; просмотров: 49 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Заголовочный файл| Symbol to digital conversion

mybiblioteka.su - 2015-2024 год. (0.006 сек.)