Go Back   VN-Zoom forum > Chia sẻ kiến thức > Lập trình > Pascal | C/C++

 

Xem Kết Quả Bầu Chọn: Khi truyền biến cho hàm, bạn chọn tham trị or tham chiếu->const
Truyền theo tham trị 0 0%
Truyền theo tham chiếu->const 4 100,00%
Bình chọn: 4. Bạn không thể bình chọn

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 03-07-2008, 10:32   #1
dst
Rìu Sắt Đôi
 
dst's Avatar
 
Tham gia: Mar 2008
Đến từ: Hà Nội
Bài: 276
VZD: 5.424
Điểm: 236/78 bài viết
Cool Vấn đề nan giải

Theo bạn, khi truyền tham số cho hàm thì ta nên truyền biến theo tham trị(cách mặc định) hay theo tham chiếu đến const?(ở đây không muốn thay đổi giá trị biến truyền sau khi kết thúc hàm). Hãy chọn và giải thích lý do!
dst vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-07-2008, 20:48   #2
Búa Đá Đôi
 
No_Way's Avatar
 
Tham gia: Mar 2008
Bài: 91
VZD: 2.272
Điểm: 23/15 bài viết
Default

theo mình là tham chiếu . Lý ro thì ......... bạn đặt ra câu hỏi thì chắc phải bít oi
__________________

No_Way vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-07-2008, 20:52   #3
Rìu Sắt Đôi
 
thanhvinh007's Avatar
 
Tham gia: Aug 2007
Bài: 211
VZD: 3.518
Điểm: 47/39 bài viết
Default

Chời! mún hok thay đổi giá trị biến sau khi kết thúc hàm thì chỉ cóa 1 cách là truyền tham chiếu thui chứ sao. Bạn phải nắm rõ cái này chứ nhỉ. Sao lại đặt câu hỏi ở đây
thanhvinh007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-07-2008, 21:00   #4
Rìu Sắt Đôi
 
thienthan's Avatar
 
Tham gia: Nov 2007
Bài: 297
VZD: 4.485
Điểm: 82/66 bài viết
Send a message via Yahoo to thienthan
Default

Trích:
dst View Post
Theo bạn, khi truyền tham số cho hàm thì ta nên truyền biến theo tham trị(cách mặc định) hay theo tham chiếu đến const?(ở đây không muốn thay đổi giá trị biến truyền sau khi kết thúc hàm). Hãy chọn và giải thích lý do!
Thực ra đúng là một câu hỏi nam giải!
Em cũng không biết chọn cái nào nữa.
Truyền tham chiếu đến const thì không thể thực hiện thay đổi biến đó. Không mất thêm bộ nhớ để thực hiện bản sao dữ liệu. Còn khi sử dụng phương thức mặc định thì nó thực hiện quá trình sao dữ liệu.
Nếu muốn kết thúc quá trình có chỉnh sửa giá trị nhưng không muốn bản gốc thay đổi ta dùng cách mặc định còn không ta cứ tham chiếu trực tiếp bằng hằng con trỏ hoặc bằng con trỏ thôi. Miễn không có câu lệnh làm đổi dữ liệu là được.
Tạo const không lẽ không muốn đổi nó ở chỗ khác sao? Vậy thì tham chiếu làm gì? Để dùng chung luôn.
thienthan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-07-2008, 10:47   #5
dst
Rìu Sắt Đôi
 
dst's Avatar
 
Tham gia: Mar 2008
Đến từ: Hà Nội
Bài: 276
VZD: 5.424
Điểm: 236/78 bài viết
Default

Tôi xin giải thích vấn đề trên như sau:
- Truyền biến cho hàm theo tham trị: rất nhiều các trình biên dịch gọi bộ tạo copy của biến và truyền nó cho hàm còn 1 số thì lưu lại giá trị của biến, hết hàm thì lưu ngược trở lại giá trị của biến->không thể thay đổi được giá trị biến truyền cho hàm trong hàm đó.
- Truyền biến theo tham chiếu: biến được truyền thật sự, bất cứ thay đổi về biến nào trong hàm cũng dẫn tới thay đổi giá trị của biến. Muốn không thay đổi giá trị thì chuyển theo tham chiếu đến const.
Còn đây là phần phân tích:
Theo mặc định, C++ truyền các đối tượng qua hàm theo tham trị(do thừa kế từ C). Trừ phi bạn xác định theo cách khác, điều này có thể rất tốn kém. VD xem xét hệ thống phân cấp sau:
class Person{
public:
Person();//tôi loại bỏ tham số cho đơn giản
virtual ~Person;//do lớp này là lớp cơ sở đa hình->phải làm hàm hủy thành ảo
...//các cài đặt khác
private:
std::string name;
std::string address;
};
class Student:public Person{
public:
Student();//tôi loại bỏ tham số cho đơn giản
~Student();
...//các cài đặt khác
private:
std::string schoolName;
std::string schoolAddress;
};
Bây giờ xem xét mã sau đây, trong đó chúng ta gọi một hàm validateStudent, hàm này lấy một đối số Student theo tham trị và trả về kết quả cho thấy nó đã được hiệu lực hóa 0:
bool validateStudent(Student s);
Student syd;
bool sydOK=validateStudent(syd);
Như bạn dễ dàng phân tích, sẽ cần tới 6 bộ tạo và 6 bộ hủy để tạo ra một đối tượng Student s từ syd. Quá tốn kém!
Còn với truyền theo tham chiếu đến const thì hiệu quả hơn nhiều do các bộ tạo và hủy không được gọi:
bool validateStudent(const Student&s)
Do validateStudent sẽ được thiết kế chỉ để kiểm tra chứ không phải sửa đối tượng Student->cần truyền tham chiếu đến const.
Việc truyền theo tham chiếu->const cũng tránh vấn đề cắt lát đối tượng. VD bạn làm việc trên một tập hợp lớp để thực thi một hệ thống cửa sổ:
class Window{
public:
...
std::string name() const;//trả về tên cửa sổ
virtual void display() const;//vẽ cửa sổ và dữ liệu
};
class WindowWithScrollBars:public Window{
public:
...
virtual void display const;
};
Giờ giả sử bạn muốn viết 1 hàm để in ra tên của 1 cửa sổ và sau đó hiển thị nó. Bạn hãy xem mã sai sau đây:
void printNameAndDisplay(Window w)
{
std::cout<<w.name();
w.display();
}
Xem xét những gì xảy ra khi bạn gọi hàm này với 1 đối tượng WindowWithScrollbars:
WindowWithScrollbars wwsb;
printNameAndDisplay(wwsb);
Điều gì xảy ra? Đối tượng wwsb sẽ bị cắt lát, wwsb.display() sẽ không gọi ...
còn nữa...
dst vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt
Trackbacks are Tắt
Pingbacks are Tắt
Refbacks are Tắt
Chuyển đến


Múi giờ GMT +7. Hiện tại là 11:54.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
Từ điển được cung cấp bởi VDict.com - Hosting được tài trợ bởi Rao vặt 123