默认构造函数作为默认参数的工作机制及Vec构造函数调用疑问
关于Vec构造函数的两个疑问解答
作为C++新手,碰到这个模板构造函数有疑问太正常啦,我来一步步给你掰扯清楚:
疑问一:调用该构造函数时不传入第二个参数会发生什么?
先看构造函数的声明:
template <class T> explicit Vec(size_type n, const T& t = T() ) { create(n, t); }
这里的const T& t = T()表示第二个参数t有一个默认值,这个默认值就是T()生成的对象。
当你不传入第二个参数时,编译器会自动用T()创建一个T类型的值初始化临时对象,把它作为t的参数传递给构造函数,随后create(n, t)函数会创建n个和这个临时对象完全一样的元素,填充到Vec容器里。
举几个具体场景的例子:
- 如果T是
int,T()就是值初始化的int,也就是0,调用Vec<int> v(5)会得到一个包含5个0的Vec; - 如果T是
std::string,T()就是空字符串"",调用Vec<std::string> v(3)会得到包含3个空字符串的Vec; - 如果T是你自己定义的类,只要这个类有默认构造函数,
T()就会调用它生成一个符合默认状态的对象。
疑问二:构造函数没有返回值,那T()为何能用来初始化参数t?
这个疑问其实是把两个完全独立的概念搞混啦:
构造函数确实没有返回值:这点你说的完全正确,构造函数的核心作用是初始化对象,它不需要(也不能)返回任何值,对象的创建过程由编译器自动处理。
T()是一个独立的表达式,和构造函数的返回值无关:T()在这里的作用是生成一个T类型的临时对象——它本质是调用T的默认构造函数来创建这个临时对象,然后把这个临时对象作为参数t的默认值。
打个简单的类比,就像你写了这样一个普通函数:
void print_n_times(int n, const std::string& s = std::string()) { for (int i=0; i<n; i++) std::cout << s << std::endl; }
这里的std::string()就是生成一个空字符串临时对象作为s的默认值,和print_n_times函数有没有返回值完全没关系。同理,Vec的构造函数虽然没有返回值,但T()只是用来生成参数的默认值,和构造函数的返回特性压根不沾边。
总结一下:T()是用来造一个临时对象给参数用的,不是构造函数的返回值,两者是完全独立的操作~
内容的提问来源于stack exchange,提问作者Chris Jing
相关产品推荐
相关产品推荐

