C++中的默认构造函数与隐式构造函数
Default vs. Implicit constructor in C++
这很琐碎,但捷克语(我的母语)不区分隐式和默认,所以我被一些捷克语翻译弄糊涂了隐式和缺省构造函数或构造函数调用之间的区别是什么。
struct Test {
Test(int n=0) { }
};
你能用这些术语描述一下什么是吗
- 试验t1
- 测试t2()
- 测试t3=3
- 测试t4(4)
- 测试t5=测试(5)
当谈到构造函数时,术语默认和隐式具有以下含义:
-
默认构造函数是一个可以在没有参数的情况下调用的构造函数。它要么不带任何参数,要么每个参数都有默认值。
-
隐式构造函数是一个常用于谈论语言中两个不同概念的术语,
-
隐式声明的构造函数,它是默认的或复制构造函数,如果没有提供用户定义的构造函数(默认值)或没有提供复制构造函数(副本),它将为所有用户类声明。也就是说,一个没有由用户声明构造函数的类隐式声明了一个默认构造函数。
-
隐式定义构造函数是一个隐含声明的构造函数dr使用1,编译器将为其提供定义。
struct test { test(int i = 0) { } // test(test const&) implicitly declared here }; struct test2 { }; // implicitly declared: test2(), test2(test2 const&) int main() { test t; test copy(t); // causes *definition* of the implicitly // declared copy constructor test2 t2; // causes *definition* of test2::test2() test2 copy2(t2); // causes *definition* of test2::test2(test2 const&) }
-
简单地说,如果构造函数可以在没有参数的情况下调用,那么它就是默认。如果构造函数不是由用户提供而是声明/定义的,则它是隐式(ly声明/定义)。
截至具体情况:
Test t1;
使用默认构造函数Test(int = 0)
,该构造函数不是隐式的。
Test t2();
这是该语言的一个奇怪之处,它声明了一个不带参数的函数,并返回一个Test
对象。
Test t3 = 3;
这被称为复制初始化,相当于从3
到Test
的隐式*转换的组合以及根据转换结果的t3
的复制构造。这将使用Test(int)
构造函数进行转换,然后使用隐式定义的(以及声明的)复制构造函数。注意:编译器可以优化副本,但它必须验证副本构造函数是否可用(访问说明符)并且可以定义。
Test t4(4);
使用Test(int)
构造函数,在本例中,它不是默认构造函数。
Test t5 = Test(5);
等效于Test t3 = 3
的情况,唯一的区别是在这种情况下从5
到Test
的转换是显式的。在本例中,这并不重要,但如果构造函数被标记为explicit
,则这一行将编译,而t3
的情况将失败。
*)隐式的另一个用法,在这种情况下,指的是代码中没有明确请求从3
到Test
的转换。将其与程序员明确请求转换的t5
进行比较:Test(5)
。
您似乎混淆了一些术语。默认构造函数是不带参数的构造函数,隐式调用是直接调用构造函数时的构造函数。
总之:
1) 试验t1;
默认构造函数。
2) 测试t2();
函数声明。
3) 测试t3=3;
复制初始化。将调用转换构造函数,从3
创建一个临时Test
,并使用复制构造函数创建t3
。
4) 测试t4(4);
直接初始化。直接使用转换构造函数。
5) 测试t5=测试(5);
复制初始化。类似于3)。
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 构造函数默认公共和私有变量
- 类模板构造函数默认参数
- 构造函数默认参数
- C++模板构造函数默认参数
- 在c++中设置构造函数默认值
- c++构造函数默认参数
- C++构造函数默认值头文件