Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Hàm trả về tham chiếu và truyền tham chiếu cho hàm.

  1. #1
    Ngày gia nhập
    09 2017
    Bài viết
    2

    Mặc định Hàm trả về tham chiếu và truyền tham chiếu cho hàm.

    Em mới học c++ có vài chỗ vẫn không hiểu mong mọi người chỉ giúp.
    Em có viết chương trình xây dựng 1 lớp đa thức
    Code:
    #include<iostream>
    using namespace std;
    class DT {
    	private:
    		int bac;
    		float* ptr;
    	public:
    		DT();
    		~DT();
    		friend istream& operator>>(istream& is,DT& u);
    		friend ostream& operator<<(ostream& os,DT& u);
    		DT& operator=(DT& u);
    		DT& operator+(DT u);		
    };
    DT::~DT() {
    	delete[] ptr;
    }
    DT::DT() {
    	bac=1;
    	ptr=new float[bac+1];
    	for(int i=0;i<bac+1;i++)
    		ptr[i]=0;
    	}
    istream& operator>>(istream& is,DT& u) {
    	cout<<"Da thuc bac: ";
    	is>>u.bac;
    	u.ptr=new float[u.bac+1];
    	for(int i=0;i<u.bac+1;i++) {
    		cout<<"Nhap he so thu "<<i<<": ";
    		is>>u.ptr[i];
    	}
    	return is;
    }
    ostream& operator<<(ostream& os,DT& u) {
    	for(int i=0;i<u.bac;i++) {
    		if(u.ptr[i+1]>=0) os<<u.ptr[i]<<"*x^"<<i<<" + ";
    		else os<<u.ptr[i]<<"*x^"<<i;
    	}
    	os<<u.ptr[u.bac]<<"*x^"<<u.bac;
    	return os;
    }
    DT& DT::operator=(DT& u) {
    	bac=u.bac;
    	ptr=new float[bac+1];
    	for(int i=0;i<bac+1;i++) {
    		ptr[i]=u.ptr[i];
    	}
    	return *this;
    }
    DT& DT::operator+(DT u) {
    	DT *temp;
    	temp=new DT;
    	temp->bac=u.bac>bac?u.bac:bac;
    	temp->ptr=new float[temp->bac+1];
    	int min=u.bac<bac?u.bac:bac;
    	for(int i=0;i<min+1;i++) {
    		temp->ptr[i]=ptr[i]+u.ptr[i];
    	}
    	for(int i=min+1;i<temp->bac+1;i++) {
    		if(min==bac) {
    			temp->ptr[i]=u.ptr[i];
    		}
    		else temp->ptr[i]=ptr[i];
    	}
    	return *temp;
    }
    int main() {
    	DT u,u1,u2;
    	cout<<"Nhap 2 da thuc: "<<endl;
    	cin>>u1>>u2;
    	cout<<"\nDa thuc 1: \n"<<u1;
    	cout<<"\nDa thuc 2: \n"<<u2;
    	u=u1+u2;
    	cout<<"\nDa thuc tong la: \n"<<u;
    }
    Em có vài chỗ không hiểu.
    1: Sao toán tử gán lại phải trả về tham chiếu vậy, sao phải truyền tham chiếu cho toán tử gán:
    Code:
    DT& DT::operator=(DT& u) sao không dùng DT DT::operator(DT& u) //Em dùng DT DT::operator(DT& u) nó vẫn gán được u=u1=u2 mà.
    Tai sao cần DT& u em có cần thay đổi giá trị của nó đâu mà cần truyền tham chiếu vậy hay nó chỉ có tác dụng khi gọi hàm thì không cần cấp phát bộ nhớ cho đối số.
    2: Sao toán tử cộng operator+ trả về tham trị thì lại không gán được u=u1+u2 vậy.
    Code:
    DT DT::operator+(DT u) {
    	DT temp;
    	temp.bac=u.bac>bac?u.bac:bac;
    	temp.ptr=new float[temp.bac+1];
    	int min=u.bac<bac?u.bac:bac;
    	for(int i=0;i<min+1;i++) {
    		temp.ptr[i]=ptr[i]+u.ptr[i];
    	}
    	for(int i=min+1;i<temp.bac+1;i++) {
    		if(min==bac) {
    			temp.ptr[i]=u.ptr[i];
    		}
    		else temp.ptr[i]=ptr[i];
    	}
    	return temp;
    }
    //-->Gán u=u1+u2 lỗi.
    Đã được chỉnh sửa lần cuối bởi DragonX : 13-09-2017 lúc 11:13 PM.

  2. #2
    Ngày gia nhập
    01 2013
    Bài viết
    1,476

    Sao toán tử gán lại phải trả về tham chiếu vậy, sao phải truyền tham chiếu cho toán tử gán.
    Nếu lớp có các op binary trả về obj mới mà dùng tham chiếu thì là sai, như bạn đã thấy rồi. Bài này dùng copy constructor và copy-and-swap cho op= là đơn giản ngay.

  3. #3
    Ngày gia nhập
    09 2017
    Bài viết
    2

    Ý anh là sao cái hàm gán ấy vẫn chạy mà mà em đâu có trả về đối tượng mới nào đâu return *this.

  4. #4
    Ngày gia nhập
    01 2013
    Bài viết
    1,476

    Trích dẫn Nguyên bản được gửi bởi DragonX Xem bài viết
    Ý anh là sao cái hàm gán ấy vẫn chạy mà mà em đâu có trả về đối tượng mới nào đâu return *this.
    Rồi. Tức là bạn cho new ngay trong op+ và cho trả về ref (nên là const ref) thì OK.

    1. Tham chiếu là để tránh phải copy vô ích.
    2. Thông báo lỗi có chỉ rõ rằng: Không được gán tham chiếu cho value. Nếu cưỡng cầu mà giải thích thì value chỉ tồn tại trong thời gian rất ngắn.

    Tham số (ref) u được gán bằng a+b khi viết c=a+b, nhưng a+b là value, nên gây lỗi biên dịch.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn