C++ 程序的输出 |第 27 组(构造函数和析构函数)
先决条件:构造函数和析构函数
1) 以下程序的输出是什么?
#include
using namespace std;
class Sand
{
public: Sand()
{
cout << "Sand ";
}
~Sand()
{
cout << "~Sand ";
}
};
class Rock
{
public: Rock()
{
cout << "Rock ";
}
~Rock()
{
cout << "~Rock ";
}
};
class Hill: public Sand
{
Rock data_;
public: Hill()
{
cout << "Hill " << endl;
}
~Hill()
{
cout << "~Hill ";
}
};
int main()
{
Hill h;
return 0;
}
输出:
Sand Rock Hill
~Hill ~Rock ~Sand
说明:首先基类对象是构造函数被调用,然后嵌入对象(数据成员)是
构造函数被调用,最后继承的构造函数被执行。破坏的顺序是相反的。
2) 以下程序的输出是什么?
class gfg
{
~gfg()
{
cout << "I love coding";
}
public: gfg()
{
cout << "I am at your service";
}
};
int main()
{
gfg mygfg;
}
输出:编译错误
error: ‘gfg::~gfg()’ is private
解释:
程序不会编译,因为析构函数是私有的。
3) 以下程序的输出是什么?
#include
using namespace std;
class X
{
public: void foo()
{
cout << "X::f ";
}
virtual void go()
{
cout << "X::g ";
}
};
class Y: public X
{
public: virtual void foo()
{
cout << "Y::f ";
}
virtual void go()
{
cout << "Y::g ";
}
};
int main()
{
X x;
Y y;
X& rx = y;
rx.foo();
rx.go();
return 0;
}
输出:
X::f Y::g
说明:方法 X::f 在 X 中是非多态的(它只在 Y 类中是多态的)。因此 rx 绑定到引用类型( X& )而不是底层对象( Y& )。
4) 以下程序的输出是什么?
class A
{
public: A(int)
{
}
};
void f()
{
A a[10];
}
int main()
{
f();
}
输出:编译错误
no matching function for call to ‘A::A()’
说明:添加公共 A(){};到类 A 的定义。您需要一个无参数构造函数才能创建类的实例。当前构造函数需要两个输入字符串参数。如果没有声明其他构造函数,通常 C++ 意味着有这样一个构造函数(= 默认无参数构造函数)。通过用两个参数声明你的第一个构造函数,你覆盖了这个默认行为,现在你必须显式声明这个构造函数。
5) 以下程序的输出是什么?
#include
using namespace std;
class GFG
{
public:
GFG()
{
cout << "Hi from GFG. ";
}
} g;
int main()
{
cout << "You are in Main";
return 0;
}
输出:
Hi from GFG. You are in Main
说明: g 是 GFG 类的对象,首先为其触发构造函数。然后打印 main 的 cout 语句。