【问题标题】:Instantiation of Templates模板的实例化
【发布时间】:2021-10-25 18:03:34
【问题描述】:

请看以下代码:

// 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&lt;double,10&gt; doubleArray 对象使用的是不带参数的默认构造函数,它是如何初始化的?

  2. 对象Array&lt;Account,1000&gt; accountArray是如何初始化的?

【问题讨论】:

  • 你从哪里得到的代码?请注意,例如 getSize() 可以是 constexpr。此外,使用浮点类型来赚钱需要非常小心,从这里的情况来看,在这方面没有考虑过。使用“美分”并使用整数类型。
  • “对象是如何初始化的?”。原谅我,但“如何”这个词感觉相当含糊。您是在问初始化对象持有什么值吗?你是在问什么代码被执行?您是在问 C++ 的哪些规则决定了初始化步骤?还是别的什么?
  • @DrewDormann - 例如,什么代码/机制将模板参数分配给它们各自的对象?我可以看到 Array doubleArray 正在制作一个包含 10 个双精度数的数组,但是 C++ 是如何做到这一点的呢?通过常规对象的实例化,将调用类构造函数,可能会使用列表成员分配。
  • @Bathsheba - 代码是一个简单的模板初始化示例,取自在线课程 - education.io。除了演示之外,代码永远不会用于任何目的。
  • 我不确定,但我现在怀疑这个问题是关于模板实例化。类模板不是类,而是类模板在实例化时创建的。

标签: c++ c++11 templates constructor


【解决方案1】:

通过将模板中的类型T替换为作为第一个参数给出的类型,并将整数N替换为来实例化模板第二个参数。
实例化getSize 的定义时也会发生同样的情况。

也就是说,Array&lt;double,10&gt; doubleArray; 的工作原理与

class DoubleArray10{

public:
  DoubleArray10()= default;
  int getSize() const;

private:
  double elem[10];
};

int DoubleArray10::getSize() const { return 10; }

DoubleArray10 doubleArray;

Array&lt;Account,1000&gt; accountArray; 完全一样

class AccountArray1000{

public:
  AccountArray1000()= default;
  int getSize() const;

private:
  Account elem[1000];
};

int AccountArray1000::getSize() const { return 1000; }

AccountArray1000 accountArray;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多