C++类模板实例化时默认构造对象的初始化过程咨询
参考代码
// templateClassTemplate.cpp #include <iostream> class Account{ public: explicit Account(double amount=0.0): balance(amount){} void deposit(double amount){ balance+= amount; } void withdraw(double amount){ balance-= amount; } double getBalance() const{ return balance; } private: double balance; }; template <typename T, int N> class Array{ public: Array()= default; int getSize() const; private: T elem[N]; }; template <typename T, int N> int Array<T,N>::getSize() const { return N; } int main(){ std::cout << std::endl; Array<double,10> doubleArray; std::cout << "doubleArray.getSize(): " << doubleArray.getSize() << std::endl; Array<Account,1000> accountArray; std::cout << "accountArray.getSize(): " << accountArray.getSize() << std::endl; std::cout << std::endl; }
问题1:Array<double,10> doubleArray无参默认构造的完整初始化过程
Array<double,10>实例化后,类内私有成员为double elem[10],你显式声明了Array()= default,所以编译器会生成隐式无参默认构造函数,完整流程如下:
- 在栈上为
doubleArray分配内存,总大小等于10个double类型的占用空间(常规64位平台下为8*10=80字节) - 调用编译器生成的默认构造函数执行初始化:
- 该默认构造没有自定义成员初始化逻辑,会对数组
elem执行默认初始化 - double属于内置算术类型,栈空间的默认初始化不会做清零操作,数组内10个double的初始值均为未定义的垃圾值,直接读取属于未定义行为
- 该默认构造没有自定义成员初始化逻辑,会对数组
- 构造完成,
doubleArray对象可正常调用成员函数。
问题2:Array<Account,1000> accountArray的初始化规则与执行流程
规则依据
C++中类类型数组做默认初始化时,会逐元素调用元素类型的默认构造函数;你定义的Account类提供了带默认参数的构造函数explicit Account(double amount=0.0),属于合法的默认构造函数,满足数组初始化要求。
执行流程
- 在栈上为
accountArray分配内存,总大小等于1000个Account对象的占用空间(常规64位平台下为8*1000=8000字节) - 调用编译器生成的
Array默认构造函数:- 对私有成员
elem数组执行默认初始化,遍历1000个数组元素,依次调用每个元素的Account默认构造函数 - 每个
Account对象构造时,用默认参数0.0初始化私有成员balance,所有元素的balance初始值均为0.0
- 对私有成员
- 数组所有元素初始化完成,
accountArray对象可正常调用成员函数。
内容的提问来源于stack exchange,提问作者Elesian
相关产品推荐
相关产品推荐

