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é tập Code viết 00:07 ngày 01/10/2018

Vì đối số nó thực sự là const mà. String là pointer to const char

Nguyễn Đức Anh viết 23:54 ngày 30/09/2018

Đâ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

Bé tập Code viết 23:51 ngày 30/09/2018

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.

Nguyễn Đức Anh viết 23:57 ngày 30/09/2018

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

Tao Không Ngu. viết 23:55 ngày 30/09/2018

This post was flagged by the community and is temporarily hidden.

Bé tập Code viết 23:54 ngày 30/09/2018

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ái string("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 ^^

Bài liên quan
0