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

Jan*_*roň 22 c++ constructor

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

struct Test {
  Test(int n=0) { }
};
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*eas 35

在讨论构造函数时,术语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&)
    }
    
    Run Code Online (Sandbox Code Playgroud)

简单来说,如果构造函数可以在没有参数的情况下调用,则它是默认的.如果构造函数不是由用户提供但是声明/定义,则构造函数是隐式的(声明/定义).

截至具体案例:

Test t1;
Run Code Online (Sandbox Code Playgroud)

使用默认构造函数,Test(int = 0)它不是隐式的.

Test t2();
Run Code Online (Sandbox Code Playgroud)

这是一种奇怪的语言怪癖,它声明了一个不带参数并返回一个Test对象的函数.

Test t3 = 3;
Run Code Online (Sandbox Code Playgroud)

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

Test t4(4);
Run Code Online (Sandbox Code Playgroud)

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

Test t5 = Test(5);
Run Code Online (Sandbox Code Playgroud)

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


*)隐式的另一种用法,在这种情况下指的是代码中未明确请求转换为3to 的事实Test.将此与t5程序员明确请求转换的位置进行比较:Test(5).


Luc*_*ore 5

你好像混淆了一些条款.一个默认的构造函数是一个它没有任何参数,一个隐含的调用是当你直接调用构造函数.

无论如何:

1)测试t1;

默认构造函数.

2)测试t2();

功能声明.

3)测试t3 = 3;

复制初始化.将调用转换构造函数,创建一个临时Test3,并使用拷贝构造函数来创建t3.

4)测试t4(4);

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

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

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