Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5678 / 802 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 4:

Объекты

< Лекция 3 || Лекция 4: 123 || Лекция 5 >
Аннотация: В соответствии с принципами объектно-ориентированного программирования решение поставленной задачи сводится к разработке модели (объявлению класса) и созданию экземпляров (объектов), представляющих реализацию этой модели. В этой лекции обсуждаются проблемы, связанные с созданием и последующим уничтожением объектов

В соответствии с принципами объектно-ориентированного программирования решение поставленной задачи сводится к разработке модели (объявлению класса) и созданию экземпляров (объектов), представляющих реализацию этой модели.

В этой главе обсуждаются проблемы, связанные с созданием и последующим уничтожением объектов.

Создание объекта. Конструктор

Конструктором называется множество операторов кода, которому передается управление при создании объекта. Синтаксис объявления конструктора аналогичен объявлению метода — те же спецификаторы доступа, имя, список параметров. Особенности конструктора заключаются в том, что:

  • конструктор НЕ ИМЕЕТ НИКАКОГО возвращаемого спецификатора, даже void ;
  • имя конструктора полностью совпадает с именем класса или структуры;
  • в классе и в структуре можно объявлять множество вариантов конструкторов. Они должны отличаться списками параметров. В структуре невозможно объявить конструктор с пустым списком параметров;
  • не существует выражения вызова для конструктора, управление в конструктор передается посредством выполнения специальной операции new.

Операция new

Операция new используется для создания объектов и передачи управления конструкторам, например:

Class1 myVal = new Class1(); // Объект ссылочного типа. Создается в куче.

new также используется для обращения к конструкторам объектов типа значений:

int myInt = new int(); // Объект типа int размещается в стеке!

При определении объекта myInt ему было присвоено начальное значение 0, которое является значением по умолчанию для типа int. Следующий оператор имеет тот же самый эффект:

int myInt = 0;

Конструктор БЕЗ ПАРАМЕТРОВ (конструктор умолчания) обеспечивает инициализацию переменной предопределенным значением. Со списком предопределенных значений, которыми инициализируются объекты предопределенных типов, можно ознакомиться в Default Values Table.

У структуры конструктор умолчания (конструктор без параметров) НЕ ПЕРЕОПРЕДЕЛЯЕТСЯ! Для них объявляются только параметризованные конструкторы.

А вот для типов — значений конструкторов с параметрами в принципе нет!

int q = new int();
//int q = new int(125); // Такого нет.

Сколько конструкторов может иметь структура? При использовании правил перегрузки – неограниченное количество.

Сколько конструкторов может иметь класс? Всегда на один больше, чем структура.

В следующем примере создаются с использованием операции new и конструктора объекты — представители класса и структуры. Для инициализации полей — членов класса используются параметры конструкторов. Присвоение значений осуществляется в теле конструктора с использованием операций присвоения:

// cs_operator_new.cs
// The new operator
using System;
class NewTest 
{
struct MyStruct 
 {
public int x;
public int y;

public MyStruct (int x, int y) 
 {
this.x = x;
this.y = y;
 }
 }
class MyClass 
 {
public string name;
public int id;

public MyClass () 
 {
 }

public MyClass (int id, string name) 
 {
this.id = id;
this.name = name;
 } 
 }

public static void Main() 
 {
// Create objects using default constructors:
MyStruct Location1 = new MyStruct();
MyClass Employee1 = new MyClass();

// Display values:
Console.WriteLine("Default values:");
Console.WriteLine(" Struct members: {0}, {1}", 
Location1.x, Location1.y);
Console.WriteLine(" Class members: {0}, {1}", 
Employee1.name, Employee1.id);
// Create objects using parameterized constructors::
MyStruct Location2 = new MyStruct(10, 20);
MyClass Employee2 = new MyClass(1234, "John Martin Smith");
// Display values:
Console.WriteLine("Assigned values:");
Console.WriteLine(" Struct members: {0}, {1}", 
Location2.x, Location2.y);
Console.WriteLine(" Class members: {0}, {1}", 
Employee2.name, Employee2.id);
 }
}
Листинг 4.1.

Кто строит конструктор умолчания

Конструктор умолчания (конструктор с пустым списком параметров) строится транслятором по умолчанию. Если класс не содержит явных объявлений конструкторов, именно этот конструктор берет на себя работу по превращению области памяти в объект.

Class X
{

}
::::::::::
X x = new X(); // Работает конструктор умолчания.

Однако попытка объявления ЛЮБОГО варианта конструктора (с параметрами или без) приводит к тому, что транслятор перестает заниматься построением собственных версий конструкторов. Отныне в классе нет больше конструктора умолчания. Теперь все зависит от соответствия оператора определения объекта построенному нами конструктору. Объявим в производном классе оба варианта конструкторов.

Class X
{
public X(int key){}
}
::::::::::
X x0 = new X(125); // Работает конструктор с параметрами.
X x1 = new X(); // Не дело! Конструктора умолчания уже нет!

Однажды взявшись за дело объявления конструкторов, разработчик класса должен брать на себя ответственность за создание ВСЕХ без исключения вариантов конструкторов, которые могут потребоваться для решения поставленной задачи. Таковы правила.

Class X
{
public X(int key){}
public X(){}
}
::::::::::
X x0 = new X(125); // Работает конструктор с параметрами.
X x1 = new X(); // Работает новый конструктор без параметров.
< Лекция 3 || Лекция 4: 123 || Лекция 5 >
kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2