Перейти к содержимому

Как создать экземпляр класса

  • автор:

Классы, структуры и пространства имен

C# является полноценным объектно-ориентированным языком. Это значит, что программу на C# можно представить в виде взаимосвязанных взаимодействующих между собой объектов.

Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.

В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.

По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :

class название_класса < // содержимое класса >

После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:

class Person

Классы и объекты в языке программирования C# и .NET

Однако такой класс не особо показателен, поэтому добавим в него некоторую функциональность.

Поля и методы класса

Класс может хранить некоторые данные. Для хранения данных в классе применяются поля . По сути поля класса — это переменные, определенные на уровне класса.

Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.

Итак, добавим в класс Person поля и методы:

class Person < public string name = "Undefined"; // имя public int age; // возраст public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

В данном случае в классе Person определено поле name , которое хранит имя, и поле age , которое хранит возраст человека. В отличие от переменных, определенных в методах, поля класса могут иметь модификаторы, которые указываются перед полем. Так, в данном случае, чтобы все поля были доступны вне класса Person поля определены с модификатором public .

При определении полей мы можем присвоить им некоторые значения, как в примере выше в случае переменной name . Если поля класса не инициализированы, то они получают значения по умолчанию. Для переменных числовых типов это число 0.

Также в классе Person определен метод Print() . Методы класса имеют доступ к его поля, и в данном случае обращаемся к полям класса name и age для вывода их значения на консоль. И чтобы этот метод был виден вне класса, он также определен с модификатором public .

Создание объекта класса

После определения класса мы можем создавать его объекты. Для создания объекта применяются конструкторы . По сути конструкторы представляют специальные методы, которые называются так же как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта. Общий синтаксис вызова конструктора:

new конструктор_класса(параметры_конструктора);

Сначала идет оператор new , который выделяет память для объекта, а после него идет вызов конструктора .

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

Если в классе не определено ни одного конструктора (как в случае с нашим классом Person), то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.

Теперь создадим объект класса Person:

Person tom = new Person(); // создание объекта класса Person // определение класса Person class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

создание классов в языке программирования C# и .NET

Для создания объекта Person используется выражение new Person() . В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект, и через эту переменную мы можем использовать данный объект и обращаться к его функциональности.

Обращение к функциональности класса

Для обращения к функциональности класса — полям, методам (а также другим элементам класса) применяется точечная нотация точки — после объекта класса ставится точка, а затем элемент класса:

объект.поле_класса объект.метод_класса(параметры_метода)

Например, обратимся к полям и методам объекта Person:

Person tom = new Person(); // создание объекта класса Person // Получаем значение полей в переменные string personName = tom.name; int personAge = tom.age; Console.WriteLine($"Имя: Возраст "); // Имя: Undefined Возраст: 0 // устанавливаем новые значения полей tom.name = "Tom"; tom.age = 37; // обращаемся к методу Print tom.Print(); // Имя: Tom Возраст: 37 class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >

Консольный вывод данной программы:

Имя: Undefined Возраст: 0 Имя: Tom Возраст: 37

Добавление класса

Обычно классы помещаются в отдельные файлы. Нередко для одного класса предназначен один файл. Если мы работаем над проектом вне среды Visual Studio, используя .NET CLI, то нам достаточно добавить новый файл класса в папку проекта. Например, добавим новый файл, который назовем Person.cs и в котором определим следующий код:

class Person < public string name = "Undefined"; public void Print() < Console.WriteLine($"Person "); > >

Здесь определен класс Person с одним полем name и методом Print.

В файле Program.cs , который представляет основной файл программы используем класс Person:

Person tom = new Person(); tom.name = "Tom"; tom.Print(); // Person Tom

Использование классов в проекте в Visual Studio в языке программирования C#

Visual Studio предоставляет по умолчанию встроенные шаблоны для добвления класса. Для добавления класса нажмем в Visual Studio правой кнопкой мыши на название проекта:

Добавление класса в Visual Studio в C#

В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )

В открывшемся окне добавления нового элемента убедимся, что в центральной части с шаблонами элементов у нас выбран пункт Class . А внизу окна в поле Name введем название добавляемого класса — пусть он будет назваться Person :

Добавление нового класса в Visual Studio в C#

В качестве названия класса можно вводить как Person, так и Person.cs. И после нажатия на кнопку добавления в проект будет добавлен новый класс, в котором можно определить тот же код и также использовать в файле Program.cs.

Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.

Несколько способов создать экземпляр класса в c++. В чем разница?

В чем разница? Между 2 и 3 еще понятно: один экземпляр хранится на куче, другой в стеке. А что с первым?

#include using namespace std; class Class < public: Class() <>Class(int a) <> >; int main()

введите сюда описание изображения

Как-то так выглядит аналогичный код на ассемблере. Компилировал с ключом -O0. Хочу заметить, что Class c(); игнорируется компилятором Такой вопрос: где хранится класс и указатель this в (1,2) и 4 случае?

Отслеживать
32.2k 15 15 золотых знаков 60 60 серебряных знаков 93 93 бронзовых знака
задан 16 мар 2020 в 17:20
89 1 1 серебряный знак 11 11 бронзовых знаков
скорее нужно спрашивать что со вторым
16 мар 2020 в 17:33
можете пояснить?
16 мар 2020 в 17:36
Что-то мне кажется, что одно из них не совсем правильное
16 мар 2020 в 17:37
дело в том, что все это компилируется
16 мар 2020 в 17:42

@suvitruf-says-reinstate-monica, чё за угар? есть вопрос, есть ответ и тут задним числом приезжает доп вопрос

19 мар 2020 в 8:39

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Между 1 и 3 еще понятно: один экземпляр хранится на куче. А второй это прототип функции. Объявление с круглыми скобками будет объявлением объекта лишь в том случаи, если в круглых скобках указаны аргументы конструктора. Объект можно создать также с помощью универсального инициализатора. Объявление fstream in2<> ;(фигурные скобки) будет идентично fstream in2 ;

P.S. Что касается третьего объекта, то new ifstream() это конструкция New-expression , для которой круглые скобки хоть и лишние, но допустимые. Это создания объекта в куче, а не объявление.

Отслеживать
ответ дан 16 мар 2020 в 17:47
AR Hovsepyan AR Hovsepyan
15.9k 3 3 золотых знака 13 13 серебряных знаков 30 30 бронзовых знаков
@Alex, согласен, стоит знать международные термины.
16 мар 2020 в 17:54
@AlexF, только, скорее не компилятор, а программист -)
16 мар 2020 в 19:39

Исправление ответа, спасибо за комментарий @ARHovsepyan.

Плохо посмотрел ассемблерный вывод прежде чем писать.

Во втором случае ты создаёшь не экземпляр объекта, а объявляешь функцию которая возвращает ifstream.

В то же время если передать аргументы то это уже будет вызов конструктора Например пример для std::vector

std::vector arr(5, 10); 

в результате arr=[10,10,10, 10, 10];

Ещё немного вариантов создания экземпляров:

  • например если использовать фигурные скобки будет вызван конструктор принимающий std::initializer_list:
std::vector arr; // arr = [5,10] 
  • Так же возможен вариант с размещающим new
char data[sizeof(std::vector)]; std::vector* arr = new (data) std::vector(); 

Создание экземпляра класса

До сих пор мы работали с уже созданными .NET типами или объектами. Но с отражением мы можем создавать экземпляры и во время выполнения, зная имя класса, который мы хотим создать. Есть несколько способов сделать это, но я предпочитаю получить ссылку на конструктор, который я хочу использовать, вызвать его, а затем использовать возвращенное значение в качестве моего экземпляра. Вот пример того, как это сделать. Сначала код, потом я все объясню:

using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace ReflectionTest < class Program < static void Main(string[] args) < Type testType = typeof(TestClass); ConstructorInfo ctor = testType.GetConstructor(System.Type.EmptyTypes); if(ctor != null) < object instance = ctor.Invoke(null); MethodInfo methodInfo = testType.GetMethod("TestMethod"); Console.WriteLine(methodInfo.Invoke(instance, new object[] < 10 >)); > Console.ReadKey(); > > public class TestClass < private int testValue = 42; public int TestMethod(int numberToAdd) < return this.testValue + numberToAdd; >> >

Я определил простой класс для тестирования этого, называемый TestClass. Он просто содержит личное поле и открытый метод. Метод возвращает значение частного свойства, к которому добавляется значение параметра. Теперь нам нужно создать новый экземпляр этого TestClass, вызвать TestMethod и вывести результат на консоль.

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

Таким образом, со ссылкой на Тип класса мы запрашиваем конструктор по умолчанию с помощью метода GetConstructor (), передавая System.Тип.EmptyTypes в качестве параметра. В случае, если нам нужен конкретный конструктор, мы должны предоставить массив типов, каждый из которых определяет, какой параметр конструктора мы ищем.

Как только у нас есть ссылка на конструктор, мы просто вызываем метод Invoke () для создания нового экземпляра класса TestClass. Мы передаем null в качестве параметра для вызова (), так как мы не хотим указывать какие-либо параметры. Мы используем GetMethod (), вместе с именем метода, который мы хотим, чтобы получить функцию TestMethod (), а затем мы еще раз используем магию метода Invoke () для вызова этой функции. На этот раз нам нужно указать параметр в виде массива объектов. Мы делаем это на лету, указывая число 10 в качестве единственного параметра, который нам нужен, и затем выводим результат вызова метода. Все это благодаря магии отражения!

This article has been fully translated into the following languages:

Is your preferred language not on the list? Click here to help us translate this article into your language!

Простой пример создания экземпляров класса на PHP.

Но, этот класс пока ничего не делает. Он просто содержит некую описательную часть такого класса, который будет содержать будущих работников.

По этому классу будут создаваться экземпляры классов, которые будут конкретными работниками.

Давайте посмотрим, как мы можем создать экземпляр класса конкретного работника, с которым уже будем производить какие-то манипуляции.

Давайте создадим новую переменную и внутрь нее разместим экземпляр класса Worker:

$worker1 = new Worker();

Экземпляры классов в PHP создаются с помощью служебного слова new и указывается имя того класса, для которого создается объект (экземпляр класса).

Можно посмотреть, что находится внутри нашей переменной:

print_r($worker1);

У нас отобразиться объект класса Worker. Но, у этого объекта пока не заполнены никакие свойства.

Для того, чтобы добавить эти данные:

$worker1->first_name = "Вася";

Аналогичным образом добавляются значения для остальных свойств. См. видео.

Можно создавать несколько экземпляров класса от одного класса.

$worker2 = new Worker();

Вот такой принцип создания экземпляров класса есть в PHP и задания его свойств.

Дмитрий Ченгаев ��
Занимаюсь заказной веб-разработкой. Подписывайтесь на телеграм канал https://t.me/dchengaev 😉
2020-12-06

Чтобы оставить сообщение, зарегистрируйтесь/войдите на сайт через:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *