📜  C++程序的输出|设置 19

📅  最后修改于: 2022-05-13 01:56:11.049000             🧑  作者: Mango

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 不是关键字,而是将其视为关键字。