📜  C++程序的输出| 17套

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

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。
破坏的过程是相反的。首先调用析构函数,然后释放内存。