C++程序的输出|设置 19
预测以下 C++ 程序的输出。
问题 1
#include
#include
using namespace std;
int main()
{
cout << sizeof("GeeksforGeeks") << endl;
cout << strlen("GeeksforGeeks");
return 0;
}
输出:
14
13
sizeof运算符返回包含空字符的字符串的大小,因此输出为 14。而 strlen()函数返回不包含空字符的字符串的确切长度,因此输出为 13。
问题2:
#include
using std::cout;
class Test
{
public:
Test();
~Test();
};
Test::Test()
{
cout << "Constructor is executed\n";
}
Test::~Test()
{
cout << "Destructor is executed\n";
}
int main()
{
delete new Test();
return 0;
}
输出:
Constructor is executed
Destructor is executed
main()函数的第一条语句看起来很奇怪,但它是完全有效的。在 C++ 中,可以在不将其句柄指向任何指针的情况下创建对象。该语句将创建一个 Test 类的对象,而没有任何指针指向它。这也可以在Java和 C# 等语言中完成。
例如考虑以下语句:
new student(); // valid both in Java & C#
上面的语句将创建一个没有任何引用指向它的学生类的对象。
问题 3:
#include
using std::cout;
class main
{
public:
main() {cout << "ctor is called\n";}
~main() {cout << "dtor is called\n";}
};
int main()
{
main m; // LINE 11
}
输出:
Compiler error:
11 8 [Error] expected ';' before 'm'
上面的程序看起来语法正确,但编译失败。原因类名。类名是 main,所以有必要告诉编译器 main 是类的名称。通常不需要编写 struct 或 class 关键字来创建类或结构的对象。但是当类的名称是 main 时,在创建类或结构的对象时就需要编写结构或类。记住 main 不是保留字。
以下是上述程序的正确版本:
#include
using std::cout;
class main
{
public:
main() { cout << "ctor is called\n";}
~main() { cout << "dtor is called\n";}
};
int main()
{
class main m;
}
现在预测以下程序的输出:
#include
using std::cout;
class main
{
public:
main() { cout << "ctor is called\n"; }
~main() { cout << "dtor is called\n"; }
};
main m; // Global object
int main()
{
}
上面的程序编译并运行良好,因为 object 是全局的。全局对象的构造函数在 main()函数之前执行,它的析构函数在 main() 终止时执行。
结论:当类/结构名称为 main 并且无论何时创建本地对象时,都必须在创建类 / 和结构的对象时编写类或结构。因为C++程序执行是从main()函数开始的。但是这个规则不适用于全局对象。同样, main 不是关键字,而是将其视为关键字。