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 не существует