关于类在声明变量的时候,到底有没有实例化有没有调用构造函数的问题。

一道笔试题,遇到了好多次类似的,每次都感到困惑,然后做完也不求甚解下次继续不会

原题如下:

问实例化类的个数:

在这里插入图片描述

#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;             // 不会调用构造函数

转载:构造函数调用的次数问题_Livedia_小达的博客-CSDN博客_构造函数调用次数例题

更多推荐