Для объектов указатели такие же, но вместо calloc и free используются new и delete

class Record

{

public:

void Init(int m,int s);

private:

int min;

int sec;

};

void Record::Init(int m,int s)

{

min=m;

sec=s;

}

int main(int argc, char* argv[])

{

Record *a; // объект - указатель на класс Record динамический объект

a= new Record; // вместо calloc

(*a).Init(6,7); // аналогично обычным переменным

delete a; // вместо free

}

Для доступа к полям через указатель можно использовать операцию -> вместо точки

int main(int argc, char* argv[])

{

Record *a; // объект - указатель на класс Record

a= new Record; // вместо calloc

a->Init(6,7); // вместо (*a).Init(6,7);

delete a; // вместо free

}

Аналогично переменным можно через указатели создавать динамические массивы объектов

int main(int argc, char* argv[])

{

Record *a; // объект - указатель на класс Record

int i;

a= new Record[5]; // массив из 5 объектов

for (i=0;i<5;i++)

{

a[i].Init(6,i); // a[0].min=a[1].min=...=a[4].min=6 a[0].sec=0 a[1].sec=1 a[2].sec=2...

}

delete[] a; // для освобождения памяти массива delete[]

}

2) оператор new на java

На java деление объектов на статические и динамические отсутствует. Нет указателей, есть ссылки. Для всех объектов выделяется память командой new, освобождение автоматическое. Массивы инициализируются также new поэлементно.

public class Record

{

public void Init(int m, int s)

{

min=m;

sec=s;

}

public int Getmin()

{

return min;

}

public int Getsec()

{

return sec;

}

private int min;

private int sec;

public static void main (String args[])

{

int i; // обычная переменная

Record a= new Record(); // один объект ссылка с инициализацией

a.Init(3, 40); // вызов метода

Record b[]= new Record[5]; // массив ссылок, но ссылки null

for (i=0;i<5;i++)

{

b[i]= new Record(); // каждый элемент массива – ссылка на Record

}

int c[] = new int [5]; // инициализация обычного массива int. int c[5]; нельзя!!!

for (i=0;i<5;i++)

{

b[i].Init(i, 10); // вызов метода поэлементно

}

for (i=0;i<5;i++)

{

c[i]=b[i].Getmin(); // поэлементная запись в массив c

}

for (i=0;i<5;i++)

{

System. out. printf("%d ",c[i]);

}

System. out. printf("\n");

}

}

вывод на консоли:

0 1 2 3 4

1. Встроенные переменные (int, double, char...) определяются как на Си int i; i=5;

2. Массив встроенных переменных инициализируется new int c[] = new int[5];

c[1]=10;

3. Объект инициализируется new: Record a=new Record(); a.Init(1,5);

4. Массив объектов инициализируется new – пустые ссылки, затем поэлементно

Record b[]= new Record[5]; for(i=0;i<5;i++){ b[i]= new Record(); }

b[3].Init(4,15);

Если не инициализировать поэлементно - ошибка null point exception обращение к пустой ссылке.

3) Метод может вызвать другой метод класса, передав значения полей

Класс треугольник, метод вычисления площади по 3 сторонам. Пусть периметр нужен только для вычисления площади, тогда метод – private

#include <math.h>

class treug

{

public:

float S();

void Init(float aa,float bb,float cc);

private:

float P(); // периметр, только для вычисления S

float a,b,c;

};

void treug::Init(float aa,float bb,float cc)

{

a=aa;

b=bb;

c=cc;

}

float treug::P()

{

return a+b+c;

}

float treug::S()

{

float p,s; // локальные переменные

p=P()/2; // полупериметр, метод S вызывает метод P – ошибки нет

s=sqrt(p*(p-a)*(p-b)*(p-c));

return s;

}

int main(int argc, char* argv[])

{

treug Z;

float y;

Z.Init(3,4,5);

y=Z.S(); // y=6

y=Z.P(); // ошибка P - private

return 0;

}

В main метод S может вызвать только объект

int main(int argc, char* argv[])

{

treug Z;

float y;

y=S(); // функции S не существует


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: