Chưa hiểu Destructors và Constructor

#include<iostream>
#include<string>
using std::cout;
using std::endl;
using std::string;
class Person{
public:
	 
	Person(){
		cout << "Person()"<<endl;
	}
	~Person(){
		cout << "~Person()" << endl;
	}
};
void main(){
	cout << "befor the scoped block" << endl; 
// 	{
// 		Person person;
// 	} 
	//Như này thì nó Chạy hàm Destructor nhưng e bỏ dấu {} đi thì nó k chạy hàm ~Person. Tại sao vậy!
	cout << "After the scoped block"<<endl;
	
}

do hàm destructor được gọi sau khi thoát khỏi scope. scope chính là vùng nằm giữa 2 ngoặc {} này.

A destructor is a special member function of a class that is executed whenever an object of it’s class goes out of scope or whenever the delete expression is applied to a pointer to the object of that class.
http://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm

1 Like

nhưng sao mình xem thì k cần {} cũng gọi được hàm Destructors

Tất nhiên bạn vẫn gọi được hàm Destructor mọi lúc, nhưng theo mình biết thì chỉ khi nào ra khỏi scope của nó thì nó mới bắt đầu thực hiện destructor.

1 Like

đây nè bạn

? thì sao bạn
do scope của person ở trường hợp này chính là hàm main, nên sau khi thoát hàm main nó mới destructor (in “After…” trước “~person”)

1 Like

nhưng sao máy mình k hiện ra như thế nhỉ

Máy bạn hiện ra như thế nào. Mình test ở cả 2 trường hợp đều gọi được destructor, riêng ở trường hợp scope là main thì hơi khó do chương trình thoát lập tức nhưng nếu chạy trên powershell thì vẫn được.

1 Like

powerShell là gì vậy. Chắc do mình cho dừng ở { } nên nó k hiện được hàm Destructor

int main()
{
  cout << "Begin {\n";
  {
    Person p; /*p chỉ tồn tại trong {} này*/
  } //p đã được hủy ngay sau dấu } này
  cout << "After }\n";
}

nếu bỏ dấu { } đi thì p tồn tại đến hết chương trình, tức là sau dấu } của main() thì nó mới được hủy

int main()
{
  cout << "Begin\n";
  Person p; /*p tồn tại tới khi main() kết thúc  */
  cout << "After\n";
}  //p đã được hủy ngay sau dấu } này
1 Like
inline  operator float()  {
		return numerator *1.0f / denominator;
	}

Có nghĩa là gì vậy

là hàm chuyển PhanSo sang float. Viết hàm này thì có thể gọi

PhanSo a(7,3); //a = 7/3
float b = float(a); //b = 2.3333..
float c = a; //ok

nếu ko có hàm trên thì ko gọi float(a) được. Có hàm operator float() thì cast “tường minh” (explicit) như b hoặc cast “âm thầm” (implicit) như c cũng được.

nhân với 1.0f là để chuyển numerator thành float, chứ int / int thì ra int, vd 7 / 3 thì ra 2 chứ ko phải 2.3333…, phải cast số 7 hoặc/và số 3 thành float thì mới ra 2.3333… được. Chữ f sau 1.0 là để cho trình dịch biết số 1.0 này là float chứ ko phải double. C++ mặc định số thực là double hết.

đáng ra phải viết là

return static_cast<float>(numerator) / denominator;

mới đúng cú pháp trong C++, nhưng mà dài dòng.

2 Likes
#include<iostream>
using std::cout;
using std::endl;
struct fraction{
	int numerator;
	int denominator;
 	fraction(){
 	};
	fraction(float value){
		cout << " Fraction(float value): " ;
	}
	inline  operator float()  {
		return numerator *1.0f / denominator;
	}
};
void main(){
	fraction fract;
	fract.denominator = 4;
	fract.numerator = 3;
	//float x = fract.numerator *1.0f/ fract.denominator;
	float value = fract;
	fraction fract2 = value;// hoặc fraction fract2(value);
	cout << value << endl;
}

Cho e hỏi nốt, tại sao chỗ này phải có hàm constructor k tham sô

fraction(){
 	};

ko có cũng ko sao. Nếu có thì nên gán numerator = 0, denominator = 1 chứ chả gán cái gì thì viết default ctor làm gì.

1 Like

k có chỗ hàm dựng trong hàm main() mình gọi nó ra bị lỗi

như vậy là vì có viết ctor fraction(float) nên bắt buộc phải viết default ctor ~.~ Cái này cũng dị thiệt

1 Like

mình chưa hiểu lắm tại sao mình xóa hàm dựng k có tham số bị lỗi

vì ngay dòng đầu tiên khai báo fraction fract; thì fractfraction được khởi tạo mà ko có tham số => cần default ctor.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?