关于类在声明变量的时候,到底有没有实例化有没有调用构造函数的问题。
一道笔试题,遇到了好多次类似的,每次都感到困惑,然后做完也不求甚解下次继续不会
原题如下:
问实例化类的个数:
#include <iostream>
#include <string>
using namespace std;
class Test {
static int sum;
public:
// 普通构造函数
Test() {
sum++;
print();
cout << "Test() is called. " << endl;
}
// 析构函数
~Test() {
sum--;
print();
cout << "~Test is called" << endl;
}
// 拷贝构造函数
Test(const Test &other) {
sum++;
print();
cout << "Test(const Test &other) is called. " << endl;
}
// 拷贝赋值函数
Test& operator= (const Test& other) {
sum++;
print();
cout << "Test& operator= (const Test& other). " << endl;
return *this;
}
void print(void) {
cout << "sum = " << sum << endl;
}
};
// 静态成员,类内声明,类外初始化
int Test::sum = 0;
int main(int argc, char *argv[])
{
std::cout << "************1111111********************" << std::endl;
Test aa;
Test b;
Test c[3];
Test d = b;
std::cout << "**************22222*******************" << std::endl;
Test *a;
Test *pa = c;
Test *p = new Test;
std::cout << "**************333333*******************" << std::endl;
Test &ra = b;
aa = b;
system("pause");
return 0;
}
运行结果
运行结果
************1111111********************
sum = 1
Test() is called.
sum = 2
Test() is called.
sum = 3
Test() is called.
sum = 4
Test() is called.
sum = 5
Test() is called.
sum = 6
Test(const Test &other) is called.
**************22222*******************
sum = 7
Test() is called.
**************333333*******************
请按任意键继续. . .
(1)可以看出,普通对象调用构造函数(2个)、数组调用构造函数(3个)、拷贝构造也会被调用(1个),共6个;
(2)指针不会调用(Test* a、Test*pa = c),new会调用(Test*p = new Test),这里可以分别增加其中某一种类型,控制变量的看结果;
(3)引用不会调用构造函数。
即:
Test a; // 会调构造函数
Test b[2]; // 会调构造函数
Test*p = new Test; // 会调构造函数
Test c = a; // 会拷贝调构造函数
Test d = &a; // 不会调用构造函数
Test* e; // 不会调用构造函数
Test* p = b; // 不会调用构造函数