这很简单,但是捷克语(我的母语)不区分隐式和默认,所以我对一些捷克语翻译感到困惑,隐式和默认构造函数或构造函数调用之间有什么区别。
struct Test {
Test(int n=0) { }
};
你能用这些术语描述什么是:
- 测试t1;
- 测试 t2();
- 测试 t3 = 3;
- 测试 t4(4);
- 测试 t5 = 测试(5);
?
这很简单,但是捷克语(我的母语)不区分隐式和默认,所以我对一些捷克语翻译感到困惑,隐式和默认构造函数或构造函数调用之间有什么区别。
struct Test {
Test(int n=0) { }
};
你能用这些术语描述什么是:
?
在谈论构造函数时,术语default和implicit具有以下含义:
默认构造函数是可以不带参数调用的构造函数。它要么不接受任何参数,要么对所接受的每个参数都有默认值。
隐式构造函数是语言中常用来谈论两个不同概念的术语,
隐式声明的构造函数,如果没有提供用户定义的构造函数(默认)或没有提供复制构造函数(复制),将为所有用户类声明默认或复制构造函数。也就是说,一个没有用户声明的构造函数的类有一个隐式声明的默认构造函数。
隐式定义的构造函数是隐式声明的构造函数,在语言中使用(odr-used 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&)
}
简单来说,如果可以不带参数调用构造函数,则它是默认的。如果构造函数不是由用户提供而是声明/定义的,则它是隐式的(已声明/定义) 。
至于具体情况:
Test t1;
使用默认构造函数 ,Test(int = 0)
它不是隐式的。
Test t2();
这是该语言的一个奇怪的怪癖,它声明了一个不带参数并返回一个Test
对象的函数。
Test t3 = 3;
这称为复制初始化,相当于隐式*转换 from 3
to和from 转换结果的Test
复制构造的组合。t3
这将使用Test(int)
构造函数进行转换,然后使用隐式定义(和声明)的复制构造函数。注意:编译器可以优化掉副本,但它必须验证复制构造函数是否可用(访问说明符)并且可以定义。
Test t4(4);
使用Test(int)
构造函数,在这种情况下它不充当默认构造函数。
Test t5 = Test(5);
等效于这种Test t3 = 3
情况,唯一的区别是在这种情况下从5
to的转换Test
是显式的。在这个例子中,这无关紧要,但如果构造函数被标记为explicit
这一行将编译,而t3
案例将失败。
*)隐式的另一种用法,在这种情况下是指代码中未明确请求从3
to的转换这一事实。Test
将此与t5
程序员明确要求转换的地方进行比较:Test(5)
.
您似乎混淆了某些术语。默认构造函数是不带参数的构造函数,隐式调用是直接调用构造函数。
反正:
1)测试t1;
默认构造函数。
2)测试t2();
函数声明。
3) 测试 t3 = 3;
复制初始化。将调用转换构造函数,创建一个临时Test
from 3
,并使用复制构造函数创建t3
。
4) 测试t4(4);
直接初始化。直接使用转换构造函数。
5)测试t5 =测试(5);
复制初始化。类似于 3)。