01/10/2018, 09:55

Operator Overloading

Ai giải thích dùm tại sao cần có kí hiệu & ở đây với ạ. Khi bỏ đi n cũng k ảnh hưởng tới kết quả gì.
Vậy tại sao cần lấy địa chỉ làm gì ?

KYN viết 12:11 ngày 01/10/2018

để địa chỉ(tham chiếu) hay ko code vẫn thế vì trong code của bạn ko làm thay đổi giá trị của biến tham chiếu đó mà chỉ dùng giá trị của nó để tính toán.
nếu có hàm nào cần thay đổi giá trị biến truyền vào thì mới cần truyền địa chỉ…

Nguyen Trong Dung viết 11:59 ngày 01/10/2018

đúng là khi nào cần thay đổi giá trị thì mới dùng tham chiếu, nhưng thấy mấy tài liệu nạp trồng cái nào cũng đưa thêm cái & vào code là sao nhỉ ?

Trần Hoàn viết 12:03 ngày 01/10/2018

Tại vì họ rảnh nên gõ vào cho vui? Hoặc là copy hết vào sửa không hết?

KYN viết 12:12 ngày 01/10/2018

It's a performance issue

stackoverflow.com
jokoon

What do I often see references in operator overloading definitions?

c++, class, reference, operator-overloading
asked by jokoon on 03:28PM - 21 Oct 10

Tao Không Ngu. viết 12:07 ngày 01/10/2018

Hi Nguyen Trong Dung.
Cái đó là truyền tham chiếu. Đại khái là bạn không phải tạo mới một đối tướng mà dùng luôn caí truyền vào. Bạn có thể tạo một hàm tạo sao chép để hiểu rõ cơ chế chuyền tham chiếu và tham trị đối tượng.

P/S Với OOP khuyên nên dùng tham chiếu sẽ dạt hiệu quả cao hơn vì các đối tượng thường có kích thước lớn và việc sao chép đối tượng chi phí rất cao.

Nguyen Trong Dung viết 12:10 ngày 01/10/2018

sếp nói cho e nghe khi nào dùng tham trỏ được k ? bất lâu nay e chỉ dùng tham trị hoặc tham chiếu. Và hiểu là Khi nào cần thay đổi nội dung thì dùng tham chiếu or tham trỏ, còn không thì dùng tham trị.

Nguyen Ca viết 12:07 ngày 01/10/2018

nếu không có

operator+(Phanso phanso)

Nó sẽ tạo 1 bản copy của phân số để xử lý trong hàm con (cấp thêm 1 vùng nhớ mới). nếu cái struct lớn thì tốn tài nguyên thôi, oprator lại là hoạt động sử dụng với tấn suất cao nữa.
dùng con trỏ thì chỉ truyên đị chỉ vào và trõ đến cùng bộ nhớ đã cấp phát trước đó, cho nên tốt hơn về perfomance.

rogp10 viết 12:00 ngày 01/10/2018

Đúng bài phải là const Phanso& ps.

Nguyễn Quốc Hoàng viết 11:57 ngày 01/10/2018

cái đó là biến tham chiếu (C++ only), biến này dùng chung bộ nhớ với biết được truyền vào cho nên với những kiểu dữ liệu có dung lượng bộ nhớ lớn (như struct) thì cách hay nhất chính là dùng tham chiếu. Tuy nhiên, tham chiếu có một nhược điểm là khi ta thay giá trị của biến tham chiếu ngay cả ở trong hàm thì giá trị của biến bị tham chiếu cũng thay đổi theo, cách để khắc phục điều này là ta sử dụng const trước biến tham chiếu, cụ thể:
void foo(const type& ref);

Lone viết 12:10 ngày 01/10/2018

Ví dụ ta có 3 hàm được đinh nghĩa như sau:

int fun1(int i){
 // do something
}
int fun2(int& i){
 // do something
}
int fun3(int* i){
// do something
}

Hàm main

int a = 5;
fun1(a);
fun2(a);
fun3(&a);

Ở fun1 a được truyền theo tham trị, tức là chương chính sẽ tạo 1 biến i là bản sao của biến a, tức là i độc lập với a, có giá trih bằng với a nhưng có vùng nhớ khác a. Mọi dòng lệnh trong fun1 sẽ làm việc với i, a hoàn toàn không bị ảnh hưởng. Mình thường dùng chuyền tham trị khi trong quá trình làm việc với i mình muốn thay đổi nó. Vd:

int fun1(int i){
     while (i%7 != 0) i++; // tìm số chia hết cho 7 lớn hơn gần nhất
     return i;
    }

Ở fun2 a được truyền theo tham chiếu, tức là chương trình sẽ truyền a vào trong hàm và đặt tên nó là i, nói cách khác i và a là 2 nickname cho cùng 1 vùng nhớ hay i với a là một. Khi đó mọi thay đổi lên i cũng sẽ tác động lên a. Mình thường dùng cái này khi mình muốn hàm thay đổi giá trị của a. Hoặc những lúc mình chỉ cần đến giá trị a chứ không muốn thay đổi nó và không muốn phải cấp phát thêm bộ nhớ để tạo bản sao như ở fun1, những lúc như này ta nên thêm từ khóa const để tránh những lỗi không mong muốn. Vd:

int fun2(const int& i){

 return i; // ok
 // return ++i; // lỗi
}

ngoài ra cũng có thể khai báo int fun2(int& i) const{}

fun 3 là truyền theo con trỏ. i là 1 con trỏ kiểu int trỏ đến vùng nhớ có tên là a, khi đó chương trình sẽ cấp phát vùng nhớ cho con trỏ i và lưu giá trị là địa chỉ của a hay i = &a, *i = a. Mọi tác động lên *i cũng sẽ tác động lên a. Mình ít dùng cái này vì mình ki bo lắm không muốn cấp phát thêm bộ nhớ. Mình hay truyền tham chiếu mỗi khi muốn thay đổi giá trị của tham số truyền vào, với các kiểu dữ liệu nhỏ thì tiết kiệm được chẳng đáng là bao nhưng mà dùng nhiều cho nó quen với cả nó tiện hơn dùng con trỏ, đỡ phải gõ thêm mấy cái * với &.

Mỗi cách sử dụng sinh ra đều có lý do của nó, tùy vào mục đích sử dụng mà bạn hãy chọn cách dùng cho hợp lý. Ở trường hợp cụ thể của bạn, thường khi overload các toán tử 2 ngôi như ±*/ << >> chả ai lại muốn làm thay đổi giá trị tham số truyền vào cả nên thường dùng tham chiếu để tăng hiệu năng (được bao nhiêu hay bấy nhiêu, tích tiểu thành đại). Còn khi overload các toán tử 1 ngôi như = += ++ … thì tất nhiên là phải truyền tham chiếu rồi.

Nguyen Trong Dung viết 12:08 ngày 01/10/2018

Thank you so much

Bài liên quan
0