In the following code what would be the values of i1 and i2
#include
using namespace std; namespace N1 { int f(int n) { return n * 2; } } namespace N2 { int f(double n) { return n * 3; } } void main() { using N1::f; int i1 = f(1.0); cout << "i1 = " << i1; using N2::f; int i2 = f(1.0); cout << "i1 = " << i2; system("pause"); }
In the following code what would be the values of i1 and i2
#include
using namespace std; namespace N1 { int f(int n) { return n * 2; } } namespace N2 { int f(double n) { return n * 3; } } void main() { using N1::f; int i1 = f(1.0); cout << "i1 = " << i1; using N2::f; int i2 = f(1.0); cout << "i1 = " << i2; system("pause"); }
Trả lời:
Đáp án đúng: B
Đoạn mã C++ sử dụng namespace và `using` để gọi các hàm trùng tên.
Đầu tiên, `using N1::f;` đưa hàm `f` từ namespace `N1` vào phạm vi hiện tại. Khi gọi `f(1.0)`, vì `1.0` là kiểu `double`, C++ sẽ tìm hàm phù hợp nhất. Trong `N1`, hàm `f(int n)` không khớp chính xác, nhưng có thể chuyển đổi `double` thành `int` (mất thông tin phần thập phân). Do đó, `f(1.0)` trong namespace `N1` được gọi với `n = 1`, và trả về `1 * 2 = 2`. `i1` nhận giá trị 2.
Tiếp theo, `using N2::f;` đưa hàm `f` từ namespace `N2` vào phạm vi hiện tại. Bây giờ, cả `N1::f` và `N2::f` đều có sẵn. Khi gọi `f(1.0)`, hàm `f(double n)` trong `N2` khớp chính xác hơn (không cần chuyển đổi kiểu). Do đó, `f(1.0)` trong namespace `N2` được gọi với `n = 1.0`, và trả về `1.0 * 3 = 3`. `i2` nhận giá trị 3.
Vậy, `i1 = 2` và `i2 = 3`.