我有一个问题,对我来说,不寻常的功课:
不要修改主要功能,而是将其打印的程序更改为 输出:
- 星期一
- 是第一天
- 本周
以下是给定的代码:
int main()
{
cout << "is the first day\n";
}
任何帮助将不胜感激:)
答案 0 :(得分:5)
他对你的演示无疑感兴趣的是,在输入主要内容之前将构建一个全局对象(在同一翻译单元中定义),并在主要退出之后销毁。
请注意,在构建此类全局对象时,std::cout
可能尚不存在(当它被销毁时,std::cout
可能不再存在),因此您执行的任何打印都有通过像printf
这样的C函数。
答案 1 :(得分:1)
看起来像一个糟糕的家庭作业问题。我没有办法在不修改main方法的情况下打印其他输出 - 除非你创建了另一个主方法来覆盖它?代码提供也是错误的 - 它应该返回0,因为main应该返回一个整数。
答案 2 :(得分:1)
这个怎么样?
#include <iostream>
#include <cstdlib>
using namespace std;
struct Foo
{
Foo()
{
cout << "Monday\nis the first day\nof the week\n";
exit(0);
}
} X;
int main()
{
cout << "is the first day\n";
}
<强>更新强> 好的,你可以在主要功能中使用名称'cout',就像某些对象不是来自iostream:
#include <iostream>
#include <string>
class Foo
{
public:
void operator <<( const std::string & s )
{
std::cout << "Monday\n" << s << "of the week";
}
} cout;
int main()
{
cout << "is the first day\n";
}
答案 3 :(得分:1)
另一个残暴的想法,只是为了它的乐趣:
#include <iostream>
using namespace std;
#define main real_main
int main()
{
cout << "is the first day\n";
}
#undef main
int main()
{
cout << "Monday\n";
int res = real_main();
cout << "of the week\n";
return res;
}
另一个不依赖于预处理程序foo的版本是使用全局静态对象构造和销毁。这是安全的,因为显然标准保证std::cout
(和朋友)在所有用户代码之前/之后被初始化和销毁:
#include <iostream>
using namespace std;
struct Homework
{
Homework()
{
cout << "Monday\n";
}
~Homework()
{
cout << "of the week\n";
}
} hw;
int main()
{
cout << "is the first day\n";
}
答案 4 :(得分:1)
至少有几种方法可以做到这一点。
cout
。main
之前和之后让事情发生。重新定义cout
:
#include <iostream>
class MyCout {};
void operator<<(MyCout& myCout, const char* message) {
std::cout << "Monday\n";
std::cout << message;
std::cout << "of the week\n";
}
MyCout cout;
int main()
{
cout << "is the first day\n";
}
为了在main之前和之后发生事情,您可以创建一个静态对象。他们的构造函数在main之前调用,而析构函数在之后调用:
#include <iostream>
class PrintExtras {
public:
PrintExtras() {
std::cout << "Monday\n";
}
~PrintExtras() {
std::cout << "of the week\n";
}
};
PrintExtras printExtras;
using std::cout;
int main()
{
cout << "is the first day\n";
}
答案 5 :(得分:0)
我认为您应该为输出流设置运算符重载。
答案 6 :(得分:0)
想一想在进入main之前或从main退出之后发生的事情。
如果您了解这些事情,那真的取决于您在课程中的位置。
备用:如果您将该名称带入全局命名空间,则main中使用的对象仅为std::cout
。除了:: std之外的名称空间中的对象也可以使用该名称。