#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;
}
Chưa hiểu Destructors và Constructor
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
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.
? 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”)
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.
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
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.
#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ì.
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
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ì fract
là fraction
được khởi tạo mà ko có tham số => cần default ctor.