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

Đề tài: Ý nghĩa của copy constructor trong C++ như thế nào?

  1. #1
    Ngày gia nhập
    10 2010
    Bài viết
    69

    Mặc định Ý nghĩa của copy constructor trong C++ như thế nào?

    Code:
    #pragma once
    #include "Hinhhoc.h"
    #include "point.h"
    #define pi 3.14
    class Hinhtron:public Hinhhoc 
    {
    private:
    	point tam;
    	int r;
    public:
    	Hinhtron(void);
    	Hinhtron(point t, int bk);
    	Hinhtron(Hinhtron &ht);
    	point GetCenter();
    	int GetRadius();
    	void SetCenter(point diem);
    	void SetRadius(int ra);
    	float Dientich();
    	void Xuatthongtin();
    	friend istream& operator>>(istream &in, Hinhtron &ht);
    	friend ostream& operator<<(ostream &out, Hinhtron &ht);
    	~Hinhtron(void);
    };
    Theo mình biết thì để khai báo Copy Constructor phải có từ khóa Const phía trước.Nhưng trong đoạn code trên có dòng:
    Hinhtron(Hinhtron &ht);
    Như vậy cách khai báo như dòng này là ý nghĩa ra sao?nếu là Copy Constructor thì phải có từ khóa const phía trươc chứ phải k?

  2. #2
    Ngày gia nhập
    05 2011
    Nơi ở
    hell
    Bài viết
    37

    Trích dẫn Nguyên bản được gửi bởi rogerminh2401 Xem bài viết
    Code:
    #pragma once
    #include "Hinhhoc.h"
    #include "point.h"
    #define pi 3.14
    class Hinhtron:public Hinhhoc 
    {
    private:
    	point tam;
    	int r;
    public:
    	Hinhtron(void);
    	Hinhtron(point t, int bk);
    	Hinhtron(Hinhtron &ht);
    	point GetCenter();
    	int GetRadius();
    	void SetCenter(point diem);
    	void SetRadius(int ra);
    	float Dientich();
    	void Xuatthongtin();
    	friend istream& operator>>(istream &in, Hinhtron &ht);
    	friend ostream& operator<<(ostream &out, Hinhtron &ht);
    	~Hinhtron(void);
    };
    Theo mình biết thì để khai báo Copy Constructor phải có từ khóa Const phía trước.Nhưng trong đoạn code trên có dòng:
    Hinhtron(Hinhtron &ht);
    Như vậy cách khai báo như dòng này là ý nghĩa ra sao?nếu là Copy Constructor thì phải có từ khóa const phía trươc chứ phải k?
    Bạn có thể search từ khóa const để tìm hiểu hơn về nó
    chú ý: Tất cả những từ const đều có thể bỏ đi được . Ở phía trên ko có tất nhiên ko sao đâu. hehe
    Tất cả những cái gì bạn ko thay đổi hoặc ko cho phép thay đổi thì nên dùng từ khóa const ^^

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Bạn có thể hiểu khái quát rằng trong cái mẫu (prototype) hàm có ngầm chứa một cái hợp đồng (contract) với trình dịch (compiler)

    Khi đặt từ khóa const cho một tham số, hợp đồng của hàm hứa với trình dịch rằng bên trong hàm không có code nào làm thay đổi tình trạng (state), tức là trị của tham số.

    Nếu bên trong hàm có chỗ nào thay đổi tham số, trình dịch sẽ báo lỗi "xin lỗi, hàm này không tuân thủ hợp đồng, yêu cầu hoặc chỉnh lại code, hoặc chỉnh lại hợp đồng"

    Nếu bên trong hàm gọi một hàm khác và truyền tham số này cho hàm được gọi thì hàm được gọi cũng phải có hợp đồng không thay đổi tham số (tức là cũng phải có từ khóa const)

    Trên nguyên tắc, copy constructor chỉ làm việc copy, không có lý do gì để thay đổi đối tượng được copied, cho nên đặt const là hợp lý.

    Nếu bạn không đặt const thì cũng không sao, vì code của copy constructor cũng không hề thay đổi tham. Tuy nhiên, nếu constructor này được gọi bởi một hàm khác có đặt từ khóa const thì trình dịch sẽ báo lỗi. Xem giải thích về hàm gọi hàm ở trên.

    Vì vậy tham số của copy constructor nên được đặt là const

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi Mr_Chan Xem bài viết
    Bạn có thể search từ khóa const để tìm hiểu hơn về nó
    chú ý: Tất cả những từ const đều có thể bỏ đi được . Ở phía trên ko có tất nhiên ko sao đâu. hehe
    Tất cả những cái gì bạn ko thay đổi hoặc ko cho phép thay đổi thì nên dùng từ khóa const ^^
    Mình đính chính lại 1 chút:
    Tất cả những từ const đều có thể bỏ đi được nhưng bỏ đi thì 1 số code có thể sẽ không chạy

    Mình lấy ví dụ: Trong 3 cách khai báo sau
    double dientich(Hinhtron ht); [D1 - by value]
    double dientich(Hinhtron& ht); [D2 - by reference]
    double dientich(Hinhtron const& ht); [D3 - by const reference] (hoặc viết const Hinhtron& ht)

    Khi gọi dientich(Hinhtron(point(0,0), 5)) chẳng hạn
    thì cách khai báo [D2] sẽ không chạy. Cách khai báo [D1] không chạy được khi copy constructor có đối số là reference Hinhtron(Hinhtron& ht) và nó chạy được khi đối số của copy constructor là const Hinhtron& ht. Cách khai báo [D3] chạy được không phụ thuộc vào copy constructor của Hinhtron.

    Giải thích (hơi khó hiểu chút, bạn đọc kỹ nha):
    - Có 3 loại giá trị (value): lvalue [V1], rvalue [V2], const value[V3]
    - Tương ứng có 3 loại reference (ref): ref bình thường [R1 - lvalue ref], rvalue ref [R2 - C++0x only] và const-ref [R3] (tạm thời cứ chấp nhận rvalue ref là 1 loại ref đi)
    - Kiểu trả về của 1 constructor hoặc 1 hàm bất kỳ là rvalue [V2] (trừ trường hợp trả về tham chiếu hoặc void)
    - 1 hàm .. func(A& a) có kiểu đối số là [R1] nên sẽ chỉ chạy khi truyền vào [R1] hoặc [V1]
    - 1 hàm .. func(const A& a) có kiểu đối số là [R3] nên chạy với tất cả các kiểu trên (R1, R2, R3, V1, V2, V3)
    - Vậy cách khai báo [D2] không chạy vì nó yêu cầu R1 mà kiểu trả về của constructor Hinhtron(point, bankinh) là [V2 - rvalue]
    - Cách khai báo [D1] sẽ dùng copy constructor để tạo ra 1 bản sao, và gọi hàm với bản sao đó. Nhưng đầu vào của copy constructor lại là Hinhtron(point, bankinh), tức là 1 rvalue [V2]. Vậy khai báo Hinhtron(Hinhtron& ht) yêu cầu [R1] nên không chạy được. Khai báo Hinhtron(Hinhtron const& ht) yêu cầu [R3] nên chạy được vì V2 chuyển được sang R3.

    - Nếu bạn đã lỡ khai báo dùng normal ref [R1] thì cũng có cách khắc phục bằng cách sử dụng biến trung gian. Vì 1 biến bình thường (non-const) là kiểu V1.
    C++ Code:
    1. Hinhtron temp(point, bankinh);
    2. dientich(temp);

    Vậy dùng thế nào là tùy bạn, nhưng theo mình thì thực sự nên và cần thiết dùng const trong những trường hợp đối tượng không bị thay đổi. Và chú ý là, khi đã bắt đầu không chuẩn trong sử dụng const thì sẽ kéo theo các hàm khác phải sai theo - và kết quả khả năng là chương trình bạn sẽ không có 1 từ khóa const nào hết. Và như vậy khả năng chương trình bạn sẽ bị rối 1 cách kinh khủng. Hãy hình dung thay vì viết:
    C++ Code:
    1. A a = a1 + a2 + a3 + a4 + a5;
    thì bạn có thể sẽ phải viết:
    C++ Code:
    1. A a;
    2. a = a1 + a2;
    3. a = a + a3;
    4. a = a + a4;
    5. a = a + a5;
    Đã được chỉnh sửa lần cuối bởi fbchicken : 20-09-2011 lúc 02:22 AM.

Các đề tài tương tự

  1. Tìm hiểu khái niệm về hàm Copy Constructor
    Gửi bởi vuongngocnam trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 26-11-2014, 02:10 PM
  2. Lỗi no copy constructor available or copy constructor is declared 'explicit'
    Gửi bởi tun_tun trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-09-2012, 06:02 PM
  3. Xin hỏi về Copy Constructor
    Gửi bởi xxria trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 08-08-2009, 07:58 PM
  4. Hỏi về copy constructor?
    Gửi bởi xxria trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 08-08-2009, 05:51 PM
  5. [ Solved ]Hỏi 1 tí về copy constructor
    Gửi bởi ktwiz trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 21-03-2008, 01:26 PM

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