繁体   English   中英

C ++中的Default与Implicit构造函数

[英]Default vs. Implicit constructor in C++

这非常简单,但捷克语(我的母语)不区分隐式和默认,所以我对一些捷克语翻译感到困惑,隐式和默认构造函数或构造函数调用之间的区别是什么。

struct Test {
  Test(int n=0) { }
};

你能用这些术语描述什么是:

  1. 测试t1;
  2. 测试t2();
  3. 试验t3 = 3;
  4. 试验t4(4);
  5. 试验t5 =试验(5);

在讨论构造函数时,术语defaultimplicit具有以下含义:

  • default constructor是一个可以不带参数调用的构造函数。 它不需要参数,也不会为每个参数设置默认值。

  • 隐式构造函数是一个常用于谈论语言中两个不同概念的术语

    • 隐式声明构造函数 ,它是默认或复制构造函数,如果未提供用户定义的构造函数(默认)或未提供复制构造函数(复制),将为所有用户类声明。 也就是说,没有用户声明的构造函数的类有一个隐式声明的默认构造函数

    • 隐式地定义的构造是一个隐式声明的构造 ,其用于(ODR使用的语言中的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;

这称为复制初始化 ,相当于从3Test的隐式*转换的组合以及从转换结果复制t3构造。 这将使用Test(int)构造函数进行转换,然后使用隐式定义 (和声明的 )复制构造函数。 注意:编译器可以优化复制,但必须验证复制构造函数是否可用(访问说明符)并且可以定义。

Test t4(4);

使用Test(int)构造函数,在这种情况下,它不作为默认构造函数。

Test t5 = Test(5);

相当于Test t3 = 3情况,唯一的区别是在这种情况下从5Test的转换是明确的。 在这个例子中它没关系,但是如果构造函数被标记为explicit该行将在t3情况失败时进行编译。


*) 隐式的另一种用法,在这种情况下指的是在代码中没有明确请求从3Test的转换这一事实。 将其与t5进行比较,其中程序员明确请求转换: Test(5)

你好像混淆了一些条款。 默认构造函数是不带参数的构造函数, 隐式调用是直接调用构造函数的时候。

无论如何:

1)测试t1;

默认构造函数。

2)测试t2();

功能声明。

3)测试t3 = 3;

复制初始化。 将调用转换构造函数,从3创建临时Test ,并使用复制构造函数创建t3

4)测试t4(4);

直接初始化。 直接使用转换构造函数。

5)试验t5 =试验(5);

复制初始化。 与3)相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM