|
דף הבית >>
זיכרון דינמי>>הגדרת
זיכרון עבור אוביקטים |
הגדרת
זיכרון עבור אוביקטיים
|
|
אפשר לאתר זיכרון אוביקטים בצורה דינמית ע"י
new .מתי שאתהעושה זאת אובייקט נוצר ופויינטר מוחזר אליו.הזיכרון
הדינמי שיוצר אובייקט מתנהג בדיוק כמו כל אובייקט אחר ,מתי
שהוא נוצר פונקציית הבנייה נקראת ומתי שהאובייקט משוחרר הפונקצייה
ההורסת נקראת . הצגה של תוכנית קצרה אשר יוצרת מחלקה שנקראת
בשם balance אשר מקשרת שם אדם אם החשבון בנק שלו ,בתוך הmain
אובייקט מסוג balance נוצר בצורה דינמית.
|
|
|
#include <iostream.h>
#include <new.h>
#include <cstring.h>
class balance {
double cur_bal;
char name [80];
public:
void set (double n, char *s) {
cur_bal = n ;
strcpy (s , name) ;
}
};
int main ( )
{
balance * p ;
char s[80];
double n;
try {
p = new balance;
}
catch ( bad_alloc xa ) {
cout<<" allocation failure \n ";
return 1;
}
p-> set (12387.87 , "ralph wilson" ) ;
p-> get_bal (n , s);
cout << s << " 's balance is; " << n ;
cout << " \n " ;
delete p ;
return 0;
}
|
|
|
בגלל ש p מכיל פויינטר לאובייקט , אופרטור החץ
משמש גישה לחברים של האובייקט.לזיכרון דינמי של אובייקטים
יש פונקציות בנייה והריסה ,הדוגמה הבאה תמחיש את הגירסה של
התוכנית הקודמת.
|
|
|
#include <iostream.h>
#include <new.h>
#include <castring.h>
class balance {
double cur_bal;
char name [80];
public:
balance( double n , char *s){
cur_bal = n ;
strcpy (name , s ) ;
}
~balance( ) {
cout << "destructing " ;
cout << name <<"\n" ;
}
void get_bal (double &n, char *s) {
n = cur_bal ;
strcpy (s , name) ;
}
};
int main ( )
{
balance * p ;
char s[80];
double n;
try {
p = new balance (12387.87 ," ralph wilson " );
}
catch ( bad_alloc xa ) {
cout<<" allocation failure \n ";
return 1;
}
p-> get _bal( n , s ) ;
cout << s << " 's balance is; " << n ;
cout << " \n " ;
delete p ;
return 0;
}
|
|
|
הפרמטרים של אוביקטיי פונקציות הבנאים מציינים
את סוג השם,אפשר גם אלתר זיכרון לוקטור של אוביקטים אבל אתה
חייב שתהייה התאמה בקלאס באחד מפונקציות הבנאים,אם לא התוכנית
לא תוכל לתקמפל.הצגת דוגמא של וקטור של balance אוביקטים אשר
מאותרים בזיכרון הדינמי והפרמטרים השייכים קוראים לבנאים.
|
|
|
#include <iostream.h>
#include <new.h>
#include <castring.h>
class balance {
double cur_bal;
char name [80];
public:
balance( double n , char *s){
cur_bal = n ;
strcpy (name , s ) ;
}
balance( ) { } ;
~balance( ) {
cout << "destructing " ;
cout << name <<"\n" ;
}
void get_bal (double n, char *s) {
cur_bal = n;
strcpy (name , s ) ;
}
void get_bal(double &n , char *s ) {
n = cur_bal;
strcpy (s , name ) ;
}
};
int main ( )
{
balance * p ;
char s[80];
double n;
int i ;
try {
p = new balance [3] ;
}
catch ( bad_alloc xa ) {
cout<<" allocation failure \n ";
return 1;
}
p[0].set (12387.87 , "ralph wilson ") ;
p[1].set (144.00 , " A.C. conners ") ;
p[2].set (-11.23 , "I.M. overdrawn") ;
for ( i=1; i <3 ; i++ ) {
p[i].get_bal ( n , s );
cout<< s << " 's balance is : " << n ;
cout <<" \n " ;
}
delete [] p;
return 0 ;
}
|
|
|
הפלט של תוכנית זו יהייה:
|
|
|
ralph wilson balance is: 12387.9
A.C. conners balance is :144
I.M. overdrawn balance is:-11.23
destructing I.M. overdrawn
destructing A.C. conners
destructing ralph wilson
|
|
|
יש סיבה אחת אשר אנו צריכים להשתמש בצורה של
[] delete כאשר מוחקים מערך של אוביקטים בזיכרון דינמי ,בכדי
שהפונקצייה ההורסת תוכל להיקרא עבור כל אחד מהאוביקטים במערך.
|
|
הקודם
|
|
הבא
|
|
|