如何使用带初始化参数的模板类?支持默认参数构造函数吗?
模板类使用带默认参数的构造函数:可行且简单!
当然可以啦!模板类完全支持带有默认参数的构造函数,我先帮你把代码补全并调整成符合需求的版本,再一步步解释细节:
#include <iostream> #include <string> template <class T> class HoHoHo { public: // 带默认参数的构造函数:默认值用T的默认构造结果 HoHoHo(T yell = T()) : yell(yell) {} // 友元运算符的声明,注意模板参数的写法 template <class TT> friend std::ostream& operator<<(std::ostream& os, const HoHoHo<TT>& obj); private: T yell; }; // 友元operator<<的完整实现 template <class TT> std::ostream& operator<<(std::ostream& os, const HoHoHo<TT>& obj) { os << obj.yell; return os; } int main() { // 1. 使用默认参数实例化:int的默认值是0 HoHoHo<int> default_int_ho; std::cout << "默认参数的int实例:" << default_int_ho << std::endl; // 2. 传入自定义参数实例化 HoHoHo<std::string> custom_str_ho("Ho Ho Ho! Merry Christmas!"); std::cout << "自定义参数的string实例:" << custom_str_ho << std::endl; return 0; }
关键细节说明:
- 构造函数的写法:原代码里的
HoHoHo<T>(T yell);是多余的,模板类的构造函数声明不需要加<T>,直接写HoHoHo(T yell)就行,加上默认参数后就是HoHoHo(T yell = T())。这里用T()作为默认值,会调用T的默认构造函数生成一个默认对象(比如int就是0,string是空字符串)。 - 实例化方式:
- 用默认参数时,直接写
HoHoHo<int> h;就可以,不需要传参数; - 传参数时,和普通类一样,
HoHoHo<string> h("xxx");。
- 用默认参数时,直接写
- 注意事项:如果你的模板参数
T是一个没有默认构造函数的自定义类,那使用默认参数实例化时会编译报错,这时候必须显式传入参数。比如如果有个类NoDefault只有带参数的构造函数,那HoHoHo<NoDefault> h;会报错,必须写成HoHoHo<NoDefault> h(NoDefault(123));。
内容的提问来源于stack exchange,提问作者xcorat
相关产品推荐
相关产品推荐

