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

时间:2012-09-09 15:13:18

标签: c++ constructor

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

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

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

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

2 个答案:

答案 0 :(得分:32)

术语默认隐式,在谈论构造函数时具有以下含义:

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

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

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

    • 隐式定义的构造函数是一个隐式声明的构造函数 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&)
    }
    

简单来说,构造函数是 default ,如果它可以不带参数调用。如果构造函数不是由用户提供但是声明/定义,则构造函数是隐式(声明/定义)

截至具体案例:

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 :(得分:5)

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

反正:

  

1)测试t1;

默认构造函数。

  

2)测试t2();

功能声明。

  

3)测试t3 = 3;

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

  

4)测试t4(4);

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

  

5)测试t5 =测试(5);

复制初始化。类似于3)。