01/10/2018, 14:53
Lỗi khi không dùng const trong copy contructor trên c++
Mình có đoạn code bên dưới:
class Complex{
private:
double re,im;
public:
Complex (double r = 0, double i = 0): re(r) , im(i){}
Complex (Complex &c): re(c.re) , im(c.im) {}
Complex operator + (Complex c);
Complex operator - (Complex c);
Complex Complex:: operator + (Complex c){
return Complex (this->re + c.re, this->im + c.im);
// lỗi ở đây - error: no matching function for call to 'Complex::Complex(Complex)'
}
Complex Complex::operator - (Complex c){
Complex tru(this->re - c.re, this->im - c.im);
return tru;
}
Nếu mình thêm const vào copyconstructor thì chạy bình thường, nếu không thì phải làm giống hàm trừ bên dưới. Return constructor mà nó báo lỗi về copyconstructor, mình thấy khó hiểu quá. Mọi người giải thích giúp mình tại sao lỗi với.
Mình hỏi thêm nữa là dấu = mặc định giữa 2 class có nghĩa là gì thế? Kiểu như:
Complex a(1,2);
Complex b;
b=a; // Thế thì toàn bộ biến của b = biến của a đúng không?
Tại hạ mới học nên nếu hỏi ngu quá mong các tiền bối thông cảm!!!
Bài liên quan
giống như
nhưng các kiểu dữ liệu có sẵn, nguyên thủy này đã được nạp chồng toán tử =, còn class bạn tự định nghĩa muốn sử dụng được toán tử = thì phải nạp chồng toán từ = này
nhưng các class mà không có thành phần dữ liệu là con trỏ thì không cần nạp chồng toán tử = làm gì, khi có con trỏ thì phải có bộ 3, operator =, destructor, copy constructor
báo lỗi gì bạn chụp lỗi lên đây, hoặc copy mã lỗi google là ra
Lỗi error: no matching function for call to ‘Complex::Complex(Complex)’. Lỗi này chung chung quá mình google ko ra. Mình biết là cần thêm const ở copy constructor nhưng ko hiểu tại sao lại phải làm vậy ấy.
tại vì bạn tự tạo ra hàm copy ctor
Complex(Complex&)
, C++ sẽ ko tự động tạo ra các copy ctors khác nữa. Ở đây class của bạn ko có cấp phát động gì hết thì chỉ viết ctorComplex(int, int)
là đủ rồi, còn lại xóa hết đi (ko cần dtor, ko cần copy ctor, ko cần assignment operator, v.v…) thì nó sẽ tự động sinh ra mấy cái đó cho bạn.xóa dòng này đi là xong:
Complex (Complex &c): re(c.re) , im(c.im) {}
Copy constructor cần const và &. Đó là quy tắc
Bạn không được phép thay đổi thuộc tính của đối tượng mà bạn đưa vào class của chính nó để tạo ra 1 bản sao chép khác. Và không thể truyền vào đối tượng là tham trị, vì khi tham trị vào nó sẽ tạo ra 1 bản sao, mà cái hàm tạo ra bản sao thì bạn đang định nghĩa -> đệ quy lặp vô hạn -> lỗi
Túm lại là, bạn nhớ quy tắc const + & trong copy constructor, còn cái lý thuyết hay cơ sở tại sao người ta tạo ra đó thì mình đã giải thích ở trên, cái này quy định ở trình biên dịch rồi
Trả lời:
Complex Complex:: operator + (Complex c)
[/quote]
Khi viết chung (không nên) thì không sử dụng cú pháp
classname::
cho phương thức.