C++程序的输出| 17套
预测以下 C++ 程序的输出。
问题 1
#include
using namespace std;
class A
{
public:
A& operator=(const A&a)
{
cout << "A's assignment operator called" << endl;
return *this;
}
};
class B
{
A a[2];
};
int main()
{
B b1, b2;
b1 = b2;
return 0;
}
输出:
A's assignment operator called
A's assignment operator called
B 类没有用户定义的赋值运算符。如果我们不编写自己的赋值运算符,编译器会创建一个默认赋值运算符。默认赋值运算符将右侧对象的所有成员一一复制到左侧对象。类 B 有类 A 的 2 个成员。它们都在语句“b1 = b2”中复制,这就是为什么有两个赋值运算符调用。
问题2
#include
#include
using namespace std;
class Test {
public:
void* operator new(size_t size);
void operator delete(void*);
Test() { cout<<"\n Constructor called"; }
~Test() { cout<<"\n Destructor called"; }
};
void* Test::operator new(size_t size)
{
cout<<"\n new called";
void *storage = malloc(size);
return storage;
}
void Test::operator delete(void *p )
{
cout<<"\n delete called";
free(p);
}
int main()
{
Test *m = new Test();
delete m;
return 0;
}
new called
Constructor called
Destructor called
delete called
让我们看看当下面的语句被执行时会发生什么。
Test *x = new Test;
当我们使用 new 关键字动态分配内存时,会发生两件事:内存分配和构造函数调用。内存分配是在运算符new 的帮助下进行的。在上面的程序中,有一个用户定义的运算符 new,所以首先调用用户定义的运算符 new,然后调用constructor。
破坏的过程是相反的。首先调用析构函数,然后释放内存。