30/09/2018, 21:50
Thắc mắc về nạp chồng hàm trong C++
Mình có viết đoạn code như sau
#include <iostream>
#include <string>
using namespace std;
const string &shorterString(const string &s1, const string &s2);
string &shorterString(string &s1, string &s2);
int main()
{
string("matrix") = "matrices";
shorterString(string("matrix"), string("matrices"));
getchar();
return (0);
}
string &shorterString(string &s1, string &s2)
{
auto &r = shorterString(const_cast<const string&>(s1), const_cast<const string&>(s2));
cout << "2" << endl;
return const_cast<string&>(r);
}
const string &shorterString(const string &s1, const string &s2)
{
cout << "1" << endl;
return s1.size() <= s2.size() ? s1 : s2;
}
Mọi người cho mình hỏi tại sao hàm trong main nó lại gọi cái const vậy, dù mình thấy đối số nó ko phải là const mà là 1 đối tượng nhưng ko đặt tên thì lẽ ra phải ưu tiên gọi hàm không có const
Bài liên quan
Vì đối số nó thực sự là
const
mà. String làpointer to const char
Đâu phải đâu bạn, mình hiểu là string(“Hello”) chẳng hạn thì nó sẽ tương đồng với string s(“Hello”) nhưng mình ko đặt tên biến, nghĩa là nó trong stack và có thể thay đổi được giá trị, trên code của mình có demo cái đó đấy, với cả string là 1 type khác hoàn toàn với xâu kí tự đấy
Mình nói cái hàm (constructor) bạn dùng kìa
string("matrix")
. Bạn trace cái definition của cái hàm đấy, mình nhớ là nó sẽ cast cái tham số thành const.Em thấy string(“a”) = b vẫn được mà, như vậy thì string(“a”) không phải là const object, mà cái em truyền lên là string(“a”). Em xin lỗi nếu hỏi ngu, giờ mới xem info của anh
This post was flagged by the community and is temporarily hidden.
Anh không biết em sử dụng compiler nào và những option như thế nào, kết quả có thể khác nhau dựa vào những chuyện đó.
"matrix"
thì kiểu nó làconst char[7]
khi em đưa vào cáistring("matrix")
vào hàm thì có thể compiler của em nó optimize nên giữ nguyên kiểu.Em có đặt tên hay không thì nó cũng trong stack hết, em đâu có cấp phát động hay là khai báo nó global đâu.
Còn việc
string("matrix") = "matrices";
về mặt lý thuyết cũng hay nhưng anh không chắc nó có phải Undefined Behavior không.Anh biết tới đó thôi, anh làm nhúng nên chẳng bao giờ đụng tới
string
, kiến thức xa xưa còn sót lại. Em nghiên cứu rồi chỉ bảo thêm cho anh với ^^