برگزیده های پرشین تولز

سوال درباره سازند ها و مخرب ها در c++

NdR

Registered User
تاریخ عضویت
10 مارس 2004
نوشته‌ها
86
لایک‌ها
0
کد:
#include <iostream>
#include <string>

class X {
public:
    X() : val(0) { std::cout << "X: default constructor\n";}

    X(const std::string& s, int i) : str(s), val(i) { std::cout << "X: constructor\n";}

private:
    std::string str;
    int val;
};

class Y {
public:
    Y() : ptr(0) { std::cout << "Y: default constructor\n";}

    Y(int size) { ptr = new int[size]; std::cout << "Y: constructor\n";}

    ~Y() { delete[] ptr; std::cout << "Y: destructor\n";}

private:
    int* ptr;
};

int main()
{
    X x("C++", 9);

    Y y(5);
}
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
کد:
#include <iostream>
#include <string>

class X {
public:
    X() : val(0) { std::cout << "X: default constructor\n";}

    X(const std::string& s, int i) : str(s), val(i) { std::cout << "X: constructor\n";}

private:
    std::string str;
    int val;
};

class Y {
public:
    Y() : ptr(0) { std::cout << "Y: default constructor\n";}

    Y(int size) { ptr = new int[size]; std::cout << "Y: constructor\n";}

    ~Y() { delete[] ptr; std::cout << "Y: destructor\n";}

private:
    int* ptr;
};

int main()
{
    X x("C++", 9);

    Y y(5);
}
ممنون دستت درد نکنه :)
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
امکانش هست مثلا کلاس x رو یه توضیح بدی؟

این تغییرات من تا در c++ تحت ویندوز 5 کارکنه:

#include <iostream>
#include <string>

class X {
public:
X() : val(0) { cout << "X: default constructor\n";}

X(const string& s, int i) : str(s), val(i) { cout << "X: constructor\n";}

private:
string str;
int val;
};

class Y {
public:
Y() : ptr(0) { cout << "Y: default constructor\n";}

Y(int size) { ptr = new int[size]; cout << "Y: constructor\n";}

~Y() { delete[] ptr; cout << "Y: destructor\n";}

private:
int* ptr;
};

int main()
{
X x("C++", 9);

Y y(5);
cin.get();
return 0;
}
 

NdR

Registered User
تاریخ عضویت
10 مارس 2004
نوشته‌ها
86
لایک‌ها
0
یک کلاس میتونه بر حسب نیاز تعدادی سازنده داشته باشه. سازنده ها هم اسم کلاسشون هستن.
اینجا کلاس X دو تا سازنده داره و دو تا متغیر، سازنده اول بدون پارامتر هست که بهش میگن (default constructor)
تو این سازنده مقادیر پیش فرض به متغیر ها داده میشه و کار ها بر اساس پیش فرض ها انجام میشه.
سازنده دوم هم که مقادیر لازم رو میگیره و متغیر ها رو مقدار دهی می کنه.
این متغیر ها رو می شد در بدنه تابع سازنده هم مقدار دهی کرد ولی اینجا اونها در هنگام بوجود اومدن مقدار میگیرن
(initialization) در حالی که در بدنه تابع assignment صورت میگیره.
این کلاس نیاز به destructor نداره. در واقع string و int مخرب خودشونو دارن.​
 

NdR

Registered User
تاریخ عضویت
10 مارس 2004
نوشته‌ها
86
لایک‌ها
0
در مورد کلاس Y:
یه تکنیکی هست به اسم resource acquisition is initialization یا RAII
یعنی منابع کلاس رو در سازنده اختصاص میدی و در مخرب آزاد میکنی.
این طوری کد کمتری نوشته میشه و احتمال اینکه برنامه نویس آزاد کردن منبعی رو فراموش کنه هم از بین میره.
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
حل شد.فکر میکنم این مثالی که خودم نوشتم معنای سازنده و مخرب رو بسیار روشن نشون میده:

PHP:
#include <iostream.h>
class nini{
 public:
   nini();
  ~nini();
 int mult(int,int);
 private :
  int a;
  int b;
};
nini::nini()
{
cout<<"Hi! Object is Created...";
}
nini::~nini()
{
cout<<"Bye! Object is Deleted..."; cin.get();
}
int nini::mult(int a,int b)
{
 return a*b;
}
int main()
{
nini ob;
cout<<"\n\n "<<ob.mult(10,10)<<"\n";
cin.get();
return 0;
}
 
بالا