1

C++ 新手 我的理解是 endl 将添加一个新行。因此,使用以下代码:

#include <iostream>

using namespace std;

void printf(string message);

int main()
{

cout << "Hello" << endl;
cout << "World" << endl;

printf("Hello");
printf("World");

return 0;

}

void printf(string message) {
cout << message << endl;
}

我希望输出是:

你好

世界

你好

世界

但是,奇怪的是,输出是:

你好

世界

你好世界

看起来,当从用户定义的方法调用时, endl 没有添加新行..?? 我在这里的理解有什么问题。请指教。

4

4 回答 4

3

问题是由于重载决议,内置printf函数被选择而不是您自定义的printf函数。这是因为字符串文字 "Hello""World" 衰减const char*由于类型衰减和内置printf函数比您自定义的更好匹配printf

解决此问题,请将printf调用替换为:

printf(std::string("Hello"));
printf(std::string("World"));

在上面的语句中,我们显式地使用std::string' 构造函数std::string字符串字面 "Hello"量创建对象,"World"然后将这些std::string对象按值传递给您的printf函数。

另一种选择是将您的自定义printf放在自定义命名空间中。或者你可以命名你的函数而不是printf它本身。

于 2022-02-03T12:09:48.797 回答
2

它使用内置的 printf 方法。尝试显式使用 std::string 以便它调用自定义 printf 方法。

printf(std::string("Hello"));
printf(std::string("World"));

或者您可以将您的方法放在不同的命名空间中:

#include <iostream>

namespace test
{
    extern void printf(const std::string& message);
}

int main()
{
    std::cout << "Hello" << std::endl;
    std::cout << "World" << std::endl;

    test::printf("Hello");
    test::printf("World");

    return 0;

}

void test::printf(const std::string& message) {
    std::cout << message << std::endl;
}
于 2022-02-03T12:07:27.000 回答
0

printf();您应该选择like以外的函数名称Print()

于 2022-02-03T12:09:09.620 回答
0

尝试将“printf”函数重命名为“print”它工作正常 -

#include <iostream>
using namespace std;
void print(string message);

int main()
{

cout << "Hello" << endl;
cout << "World" << endl;

print("Hello");
print("World");
cout <<endl;
return 0;

}

void print(std::string message) {
cout << message << endl;
}
于 2022-02-03T12:15:35.030 回答