You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,所以编译器会生成隐式无参默认构造函数,完整流程如下:

  1. 在栈上为doubleArray分配内存,总大小等于10个double类型的占用空间(常规64位平台下为8*10=80字节)
  2. 调用编译器生成的默认构造函数执行初始化:
    • 该默认构造没有自定义成员初始化逻辑,会对数组elem执行默认初始化
    • double属于内置算术类型,栈空间的默认初始化不会做清零操作,数组内10个double的初始值均为未定义的垃圾值,直接读取属于未定义行为
  3. 构造完成,doubleArray对象可正常调用成员函数。

问题2:Array<Account,1000> accountArray的初始化规则与执行流程

规则依据

C++中类类型数组做默认初始化时,会逐元素调用元素类型的默认构造函数;你定义的Account类提供了带默认参数的构造函数explicit Account(double amount=0.0),属于合法的默认构造函数,满足数组初始化要求。

执行流程

  1. 在栈上为accountArray分配内存,总大小等于1000个Account对象的占用空间(常规64位平台下为8*1000=8000字节)
  2. 调用编译器生成的Array默认构造函数:
    • 对私有成员elem数组执行默认初始化,遍历1000个数组元素,依次调用每个元素的Account默认构造函数
    • 每个Account对象构造时,用默认参数0.0初始化私有成员balance,所有元素的balance初始值均为0.0
  3. 数组所有元素初始化完成,accountArray对象可正常调用成员函数。

内容的提问来源于stack exchange,提问作者Elesian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:00:03