30/09/2018, 17:24

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;
	
}
Minh Hoàng viết 19:40 ngày 30/09/2018

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

Hoan Sò viết 19:30 ngày 30/09/2018

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

Minh Hoàng viết 19:27 ngày 30/09/2018

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.

Hoan Sò viết 19:35 ngày 30/09/2018

đây nè bạn

Minh Hoàng viết 19:32 ngày 30/09/2018

? 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”)

Hoan Sò viết 19:41 ngày 30/09/2018

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

Minh Hoàng viết 19:30 ngày 30/09/2018

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.

Hoan Sò viết 19:37 ngày 30/09/2018

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

viết 19:27 ngày 30/09/2018
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
Hoan Sò viết 19:34 ngày 30/09/2018
inline  operator float()  {
		return numerator *1.0f / denominator;
	}

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

viết 19:31 ngày 30/09/2018

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.

Hoan Sò viết 19:28 ngày 30/09/2018
#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(){
 	};
viết 19:36 ngày 30/09/2018

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ì.

Hoan Sò viết 19:31 ngày 30/09/2018

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

viết 19:35 ngày 30/09/2018

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

Hoan Sò viết 19:33 ngày 30/09/2018

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

viết 19:37 ngày 30/09/2018

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.

Bài liên quan
0