1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Листинг #1 Деструктор #include <iostream> using namespace std; class MyClass{ public: ~MyClass(){ cout << "destructor"; }; }; int main(){ { MyClass X; } //X прекратил своё существование cin.get(); { MyClass X; } //X прекратил своё существование cin.get(); } |
1 2 3 |
int *arr = new int[100]; //выделяется //какой-то код delete []arr; //очищается |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//Листинг #2 Использование конструктора и деструктора #include <iostream> using namespace std; class MyArray{ int *ptr; //указатель, будет выполнять роль массива int size_; //число вмещаемых в массив элементов public: MyArray(); //Прототип конструктора по умолчанию MyArray(int value); //Прототип конструктора с параметром, принимает число, обозначающее вместимость массива ~MyArray(); //прототип деструктора }; MyArray::MyArray(){ ptr = 0; //костыль, чтобы []delete не применилось к указателю, под который не выделилось памяти. } MyArray::MyArray(int value){ size_ = value; //Запоминаем вошедшее в value значение как размер массива в переменную size класса ptr = new int[size_]; //выделяем память, согласно размеру } MyArray:: ~MyArray(){ //деструктор delete []ptr; //высвобождаем память } int main(){ MyArray arr1; //создали объект, этот объект представляет собой массив MyArray arr2(20); //создали объект, этот объект представляет собой массив из 20 элементов } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
//Листинг #3 Использование деструктора Создаём объект, подобный одномерному массиву #include <iostream> using namespace std; class MyArray{ int *ptr; //указатель, будет выполнять роль массива int size_; //число вмещаемых в массив элементов public: MyArray(); //Прототип конструктора по умолчанию MyArray(int value); //Прототип конструктора с параметром, принимает число, обозначающее вместимость массива ~MyArray(); //прототип деструктора /*МЕТОД ЗАПОЛНЕНИЯ МАССИВА*/ void fill(){ for (int i=0; i<size_; i++){ //С помощью цикла обхожу массив ptr[i] = i; //И заполняю массив значениями по порядку (0,1,2...) } } /*МЕТОД ВЫВОДА МАССИВА НА ЭКРАН*/ void print(){ for (int i=0; i<size_; i++){ //обычный цикл обхода массива cout << ptr[i] << ' '; //и вывод значений на экран } cout << '\n'; } }; MyArray::MyArray(){ ptr = 0; //костыль, чтобы []delete не применилось к указателю, под который не выделилось памяти. } MyArray::MyArray(int value){ size_ = value; //Запоминаем вошедшее в value значение как размер массива в переменную size класса ptr = new int[size_]; //выделяем память, согласно размеру } MyArray:: ~MyArray(){ //деструктор delete []ptr; //высвобождаем память } int main(){ MyArray arr1(5); //создали объект, этот объект представляет собой массив из 20 элементов MyArray arr2(6); //создали объект, этот объект представляет собой массив из 20 элементов MyArray arr3(7); //создали объект, этот объект представляет собой массив из 20 элементов arr1.fill(); //заполнили массивы arr2.fill(); arr3.fill(); cout << "arr1: "; arr1.print(); //выводим значения на экран cout << "arr2: "; arr2.print(); cout << "arr3: "; arr3.print(); //в любой момент можно использовать нужный объект cout << "arr1: "; arr1.print(); } |
1 2 3 4 5 6 7 8 9 10 11 |
int main(){ int N = 0; cout << "input size arr: "; cin >> N; MyArray arr(N); //Теперь можно легко создавать одномерный массив, не используя константу времени компиляции и не втыкая в new/delete arr.fill(); arr.show(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//Листинг #a1 #include <iostream> using namespace std; int main(){ int *p; int a = 10; p = &a; delete []p; //нельзя, потому что не было new[] Нельзя delete применять к a } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//Листинг #4 Прячем конструктор умолчания в секцию private #include <iostream> using namespace std; class MyArray{ int *ptr; //указатель, будет выполнять роль массива int size_; //число вмещаемых в массив элементов MyArray(); //Прототип конструктора по умолчанию, прячем в private public: MyArray(int value); //Прототип конструктора с параметром, принимает число, обозначающее вместимость массива ~MyArray(); //прототип деструктора /*МЕТОД ЗАПОЛНЕНИЯ МАССИВА*/ void fill(){ for (int i=0; i<size_; i++){ //С помощью цикла объожу массив ptr[i] = i; //И заполняю массив значениями по порядку (0,1,2...) } } /*МЕТОД ВЫВОДА МАССИВА НА ЭКРАН*/ void print(){ for (int i=0; i<size_; i++){ //обычный цикл обхода массива cout << ptr[i] << ' '; //и вывод значений на экран } cout << '\n'; } }; MyArray::MyArray(){} MyArray::MyArray(int value){ size_ = value; //Запоминаем вошедшее в value значение как размер массива в переменную size класса ptr = new int[size_]; //выделяем память, согласно размеру } MyArray:: ~MyArray(){ //деструктор delete []ptr; //высвобождаем память } int main(){ //MyArray arr; //Теперь так нельзя MyArray arr(10); //Зато так можно arr.fill(); arr.print(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
//Листинг #5 Подсматриваем, когда работает конструктор, когда работает деструктор #include <iostream> using namespace std; class MyArray{ int *ptr; //указатель, будет выполнять роль массива int size_; //число вмещаемых в массив элементов public: MyArray(int value); //Прототип конструктора с параметром, принимает число, обозначающее вместимость массива ~MyArray(); //прототип деструктора /*МЕТОД ЗАПОЛНЕНИЯ МАССИВА*/ void fill(){ for (int i=0; i<size_; i++){ //С помощью цикла объожу массив ptr[i] = i; //И заполняю массив значениями по порядку (0,1,2...) } } /*МЕТОД ВЫВОДА МАССИВА НА ЭКРАН*/ void print(){ for (int i=0; i<size_; i++){ //обычный цикл обхода массива cout << ptr[i] << ' '; //и вывод значений на экран } cout << '\n'; } MyArray(); //Прототип конструктора по умолчанию, прячем в private }; MyArray::MyArray(){} MyArray::MyArray(int value){ size_ = value; //Запоминаем вошедшее в value значение как размер массива в переменную size класса ptr = new int[size_]; //выделяем память, согласно размеру cout << "object build\n"; //выводим информационную составляющую: объект был собран } MyArray:: ~MyArray(){ //деструктор delete []ptr; //высвобождаем память cout << "object destroyed\n"; //выводим информативную составляющую: объект уничтожен } int main(){ MyArray arr1(10); //выведется object build MyArray arr2(15); //выведется object build MyArray arr3(7); //выведется object build arr1.fill(); arr1.print(); arr2.fill(); arr2.print(); arr3.fill(); arr3.print(); /*Объекты больше не используются*/ //выведется object destroyed //первый деструктор отработал //выведется object destroyed //второ отработал //выведется object destroyed //третий отработал } |
Спасибо за ваш труд!!!