精华内容
下载资源
问答
  • Java抽象类可以构造函数

    万次阅读 多人点赞 2019-03-11 21:23:51
    因为你不可以创建抽象的实例,所以构造函数只能通过构造函数链调用(Java中构造函数链指的是从其他构造函数调用一个构造函数),例如,当你创建具体的实现。现在一些面试官问,如果你不能对抽象实例化那么构造...

    可以有,抽象类可以声明并定义构造函数。因为你不可以创建抽象类的实例,所以构造函数只能通过构造函数链调用(Java中构造函数链指的是从其他构造函数调用一个构造函数),例如,当你创建具体的实现类。现在一些面试官问,如果你不能对抽象类实例化那么构造函数的作用是什么?好吧,他可以用来初始化抽象类内部声明的通用变量,并被各种实现使用。另外,即使你没有提供任何构造函数,编译器将为抽象类添加默认的无参数的构造函数,没有的话你的子类将无法编译,因为在任何构造函数中的第一条语句隐式调用super(),Java中默认超类的构造函数。

    展开全文
  • 如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数 今天在看《深度探索C++对象模型》的第二章:“构造函数语意学”的时候发现之前听到的说法是错误的。 比如说如下代码: class A { public: int a;...

    之前在上C++的课的时候,印象中有那么一句话:
    如果一个类没有任何构造函数,那么编译器会生成一个默认的构造函数


    今天在看《深度探索C++对象模型》的第二章:“构造函数语意学”的时候发现之前听到的说法是错误的。

    比如说如下代码:

    class A {
    public:
        int a;
    };
    
    int main(void) {
        A a;
        a.a = 4;
        A a2;
        a2.a=5;
        return 0;
    }
    

    按照之前的说法,类A没有任何构造函数,编译器会自动生成一个默认的构造函数,但事实是并不会。把上面的代码反汇编后可以看到结果:

    main:
            push    rbp
            mov     rbp, rsp               #int main(void) 
            mov     DWORD PTR [rbp-4], 4   #a.a = 4;
            mov     DWORD PTR [rbp-8], 5   #a2.a=5;
            mov     eax, 0                 #return 0;
            pop     rbp
            ret
    

    我们可以发现这个类的对象被直接拿来用了,没有调用任何构造函数,也没有任何的初始化。


    根据《深度探索C++对象模型》书上的说法,编译器只在一定需要默认构造函数时,才会创建默认构造函数,比如说:

    class A {
    public:
        A() {a = 0; }
        int a;
    };
    class B : public A {
        A _tmp;
    };
    int main(void) {
        B b;
        return 0;
    }
    

    在类B对象初始化时,类B对象中存在一个需要默认构造函数进行初始化的类A对象,那么类B对象必须要有默认构造函数,因此编译器在迫不得已的情况下创建了类B对象的默认构造函数。
    反汇编可以看到类B的默认构造函数:

    A::A() [base object constructor]:
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            mov     rax, QWORD PTR [rbp-8]
            mov     DWORD PTR [rax], 0
            nop
            pop     rbp
            ret
    B::B() [base object constructor]:
            push    rbp
            mov     rbp, rsp
            sub     rsp, 16
            mov     QWORD PTR [rbp-8], rdi
            mov     rax, QWORD PTR [rbp-8]
            mov     rdi, rax
            call    A::A() [base object constructor]
            mov     rax, QWORD PTR [rbp-8]
            add     rax, 4
            mov     rdi, rax
            call    A::A() [complete object constructor]
            nop
            leave
            ret
    main:
            push    rbp
            mov     rbp, rsp
            sub     rsp, 16
            lea     rax, [rbp-8]
            mov     rdi, rax
            call    B::B() [complete object constructor]
            mov     eax, 0
            leave
            ret
    
    展开全文
  • 抽象可以构造函数

    千次阅读 2017-06-11 16:48:25
    而派生在实例化调用构造函数的时候会先调用基类中的构造函数,所以抽象构造函数也是可以被调用的,所以抽象可以构造函数。抽象的析构函数最后是虚析构函数。 比如上面的程序在执行的时候就会执行...

    抽象类中也是可以有构造函数的。虽然抽象类不能实例化,但是抽象类被继承之后,它的派生类可以实例化;而派生类在实例化调用构造函数的时候会先调用基类中的构造函数,所以抽象类的构造函数也是可以被调用的,所以抽象类中可以有构造函数。抽象类的析构函数最后是虚析构函数。


    比如上面的程序在执行的时候就会执行Animal的构造函数,所以最后的运行结果为:
    goujiao

    1s

    展开全文
  • 今天在面试的时候,写了一个类,自己在另一个构造函数中调用了另一个构造函数,面试官说,这样不行吧,你回去查查。 后来回来一查,果然我写的有问题。下面一篇文章写的很好详细,我这里转过来,原文来自这里:...

    今天在面试的时候,写了一个类,自己在另一个构造函数中调用了另一个构造函数,面试官说,这样不行吧,你回去查查。

    后来回来一查,果然我写的有问题。下面一篇文章写的很好详细,我这里转过来,原文来自这里:http://www.cnblogs.com/chio/archive/2007/10/20/931043.html

    --------从这里开始转载---------

    题目如下:问下列代码的打印结果为0吗?

    [cpp]  view plain  copy
    1. #include <stdlib.h>  
    2. #include <iostream>  
    3. using namespace std;  
    4.   
    5. struct CLS  
    6. {  
    7.     int m_i;  
    8.     CLS( int i ) : m_i(i){}  
    9.     CLS()  
    10.     {  
    11.         CLS(0);  
    12.     }  
    13. };  
    14. int main()  
    15. {  
    16.     CLS obj;  
    17.     cout << obj.m_i << endl;  
    18.   
    19.     system("PAUSE");  
    20.     return 0;  
    21. }  
    打印结果是不定的,不一定为0

    代码奇怪的地方在于构造函数中调用了自己的另一个构造函数

    我们知道,当定义一个对象时,会按顺序做2件事情:
    1)分配好内存(非静态数据成员是未初始化的)
    2)调用构造函数(构造函数的本意就是初始化非静态数据成员)

    显然上面代码中,CLS obj;这里已经为obj分配了内存,然后调用默认构造函数,但是默认构造函数还未执行完,却调用了另一个构造函数,这样相当于产生了一个匿名的临时CLS对象,它调用CLS(int)构造函数,将这个匿名临时对象自己的数据成员m_i初始化为0;但是obj的数据成员并没有得到初始化。于是obj的m_i是未初始化的,因此其值也是不确定的

    从这里,我们归纳如下:
    1)在c++里,由于构造函数允许有默认参数,使得这种构造函数调用构造函数来重用代码的需求大为减少
    2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可
    3)偶尔我们还是希望在类的构造函数里调用另一个构造函数,可以按下面方式做:
    在构造函数里调用另一个构造函数的关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placement new做到:
    先看看标准库中placement new的定义
    [cpp]  view plain  copy
    1. inline void *__cdecl operator new(size_tvoid *_P)  
    2. {  
    3.     return (_P);   
    4. }   
    可见没有分配新的内存。

    正确的方式:
    [cpp]  view plain  copy
    1. struct CLS  
    2. {  
    3.     int m_i;  
    4.     CLS( int i ) : m_i(i){}  
    5.     CLS()  
    6.     {  
    7.         new (this)CLS(0);  
    8.     }  
    9. };  

    另: 若构造函数调用自身,则会出现无限递归调用,是不允许的。

    --------结束转载------------

    所以,在实际使用的时候,单纯的在构造函数中调用其它的构造函数,只是会产生一个临时的匿名变量。如果仅仅是为了重用代码,可以把重用的代码封装成一个新的函数。

    展开全文
  • 中的构造函数

    千次阅读 2019-07-29 17:47:25
    中的构造函数 ...当定义一个类的时候,如果这个没有定义构造函数,则系统会为该提供一个默认的无参数的构造函数。如果自己在中定义了一个带参数的构造函数,则系统的默认无参数构造函数就不会提供...
  • 上面中,已经有一个构造函数,形参有两个,我们又重载一个有3个形参的构造函数,为了减少代码量,就想着让3个参数的构造函数调用2个参数的构造函数,然后在执行一些自己的代码,这就如同派生先调用基类的同名...
  • Android Studio新建类没有构造函数

    千次阅读 2016-10-05 15:46:12
    Android Studio新建类没有构造函数
  • 今天被问到抽象要不要有构造函数的时候, 我随口答应该是没有的, 我以为, 抽象是不能直接用new来被实例化的, 所以也就不需要再去写构造函数了; 随后查了一下明白: 抽象也需要构造函数, 在大多数情况中抽象...
  • 如果用户没有自行编写构造函数,则 C++ 自动提供一个无参数的构造函数,称为默认构造函数。这个默认构造函数不做任何初始化工作。一旦用户编写了构造函数,则这个无参数的默认构造函数就消失了。如果用户还希望能有...
  • C++:派生类的默认构造函数和拷贝构造函数调用基类构造函数的机制(含程序验证) ... 3、如果基类定义了带参数的构造函数,派生类没有定义任何带参数的构造函数,则不能直接调用基类的带参构造函数,程序编译不通过。
  • Kotlin构造函数及多个构造函数

    万次阅读 2018-05-07 17:57:44
    Kotlin构造函数首先 强调一下 如果下面这样行代码是构造函数的话 class ClassName(name:String){}那么每一个Kotlin只有一个构造函数 没有多个构造函数其实由于代码什么的都是源于国外的 所以在翻译过程中多说...
  • 抽象类可以构造函数么?

    千次阅读 2015-03-06 21:48:52
    什么是抽象 1、被定义为abstract的称为抽象 2、成员函数被定义为abstract的...以上两点看抽象不能有构造函数,但是大家别忘了,在生成子类对象的时候,子类的构造函数要先调用父类的构造函数。从这一点可以
  • 每个只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数(也只是在需要的...
  • C++ (构造函数和析构函数)

    万次阅读 多人点赞 2018-07-20 19:00:51
    文章概述 构造函数和析构函数的由来? 构造函数和析构函数的基本语法 C++编译器构造析构方案 PK 对象显示初始化方案 构造函数的分类以及调用 ...构造函数种特殊的成员函数,与其他函数不同,不需要用户调用它,而...
  • c++ 构造函数详解

    万次阅读 多人点赞 2019-05-31 17:20:58
    c++构造函数详解。(构造函数的分类、拷贝构造函数
  • java为什么要写一个无参构造函数

    千次阅读 2017-07-18 16:11:12
    那么无参的构造方法必须显式的写出来,否则会编译失败"这句话有点不妥,应该这么理解:每个至少要有一个构造函数,如果你自己构建了一个带有参数的构造函数没有再显示的写出无参的构造函数也是可以的,...
  • 编译器永远不会把模板构造函数视为构造函数,即使客户没有自己定义拷贝构造函数,编译器也会生成一个默认的拷贝构造函数,这种情况同样存在于拷贝赋值函数和模板拷贝赋值函数。请看下面的例子:
  • 构造函数与拷贝构造函数

    千次阅读 多人点赞 2019-04-03 09:07:15
    众所周知,构造函数一个初始化对象的函数,即使不显示调用,编译器也会隐式调用构造函数初始化对象。同样的,拷贝构造函数是一种特殊的构造函数,目的也是初始化对象,同样在不声明的情况下也会隐式调用该...
  • 构造函数

    千次阅读 2016-03-07 22:28:52
    构造函数的函数名与类名相同,没有返回类型,不能声明为const成员函数(因为直到构造函数初始化过程后,对象才能真正的取得其常量属性)一个类可以有多个构造函数构造函数一个初始化列表。   &构造函数初始...
  •  *本例意在说明如果一个类里定义了构造函数,则系统不会再给定义默认的无参构造函数  */ public class Rock { public static void main(String[] args) { // TODO Auto-generated method stub System.err....
  • c++中在一个类中定义另一个只有带参数构造函数的对象,编译通不过 class A {  public: A(int i){}  }; class B {  public: B(){}  private:  //A a; //这里当然通不过,没有可用的构造函数  A...
  • C++中构造函数与复制构造函数

    千次阅读 2017-04-27 10:52:42
    在网络上有朋友提到“主要原因在于编译器的优化,当复制构造函数是public时,编译器就会根据这特性来对代码进行优化。当程序运行时,编译器发现复制构造函数是public,则说明程序允许对象之间的复制,此时就会通过...
  • c++构造函数分类说明

    千次阅读 2017-07-15 15:43:23
    3. 构造函数可以被重载,但是每次对象创建时只会调用其中的一个; 我们可以将构造总结为以下几,不同入参决定调用不同的构造函数,它们分别是普通构造函数 、默认构造函数 、拷贝构造函数 、转换构造函
  • 初始化列表是用于构造函数参数的初始化,与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟系列以逗号分隔的初始化字段。 如: class myClock { ...
  • 一个空时,编译器会默认生成构造函数,拷贝构造函数,赋值函数,析构函数一个类如果重写拷贝构造函数,那么必须自定义一个构造函数。如下代码会编译出错:error C2512: “B”: 没有合适的默认构造函数可用class B ...
  • 构造函数可以私有吗?

    千次阅读 2014-03-05 23:05:17
    通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的... 我们知道,当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不
  • ERROR C2514:XXX类没有构造函数

    千次阅读 2016-07-27 10:01:44
    在主控的.h头文件中通过 ...ERROR error: C2514: “PlcSocket”: 类没有构造函数 的错误。很明显,也不会在新建一个类的时候不添加构造函数的,那这是为什么呢?  原来是因为在主控的.cpp实现文件中需要通过includ
  • 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!...每个只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不编写上述

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 947,846
精华内容 379,138
关键字:

一个类可以没有构造函数吗