VB6.0 实现textbox怎么用的内容随combobox选中项而显示相关内容(combobox里选择学号,textbox怎么用显示相应姓名)

所谓继承,就是指子类“是一种”基类所以子类一定会具备基类的所有特征。

子类无法访问基类的私有成员所以必须子类调用父类构造方法父类的构造函数来初始化父類的成员。

对於子类来说它不是“不会子类调用父类构造方法父类的构造函数”,而是“隠藏”了它必要时候,你还是可以用特殊方法显式子类调用父类构造方法的

为了达到你的目的,你有两个选择:

一为基类提供一个怠工(dummy)构造函数,不作为

BTW,构造函数唯一的目嘚在於初始化对象获取资源而不初始化,有悖RAII原则所以基本上,第一种情况不大可能出现

并且,子类无法访问父类的私有成员所鉯子类必须子类调用父类构造方法父类的构造函数来初始化父类的成员。

实例一个子类的时候也会实例一个父类的,我是这么理解的

下載百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

C++中每个类都有其构造与析构函数它们负责对象的创建和对象的清理和回收,即使我们不写这两个编译器也会默认为我们提供这些构造函数。下面仍然是通过反汇编的方式来说明C++中构造和析构函数是如何工作的

在一般讲解C++的书籍中都会提及到当我们不为类提供任何构造与析构函数时编译器会默认提供这样六种成员函数:不带参构造,拷贝构造“=”的重载函数,析构函数以及带const和不带const的取哋址符重载。但是编译器具体是怎么做的下面来对其中的部分进行说明

下面是对应的汇编源码:

sub esp,140h;栈顶向上抬了140h的空间用于存储类对象的數据

从上面可以看到,在定义类的对象时并没有进行任何的函数子类调用父类构造方法在进行对象的内存空间分配时仅仅是将栈容量扩夶,就好像定义一个普通变量一样也就是说在默认情况下编译器并不会提供不带参的构造函数,在初始化对象时仅仅将其作为一个普通變量在编译之前计算出它所占内存的大小,然后分配并不子类调用父类构造方法函数。 再看下面一个例子:

这段C++代码与之前的仅仅是哆了一个虚函数这个时候编译器为这个类定义了一个默认的构造函数,从汇编代码中可以看到这个构造函数主要初始化了类对象的头4個字节,将虚函数表的地址放入到这个4个字节中因此我们得出结论,一般编译器不会提供不带参的构造函数除非类中有虚函数。 下面請看这样一个例子:

;最后函数的收尾工作代码略

从上面的代码看,当父类存在构造函数时编译器会默认为子类添加构造函数,子类的構造函数主要是子类调用父类构造方法父类的构造函数

从上面的代码中可以看到,当父类有虚函数时编译器也会提供构造函数,主要鼡于初始化头四个字节的虚函数表的指针

当我们不写拷贝构造的时候,仍然能用一个对象初始化另一个对象下面是这样的一段代码

我們还是用之前定义的那个test类,将类中的虚函数去掉下面是对应的反汇编代码

从这段代码中可以看到,利用一个已有的类对象来初始化一個新的对象时编译器仍然没有为其提供所谓的默认拷贝构造函数,在初始化时利用串操作将一个对象的内容拷贝到另一个对象。 当类Φ有虚函数时会提供一个拷贝构造,主要用于初始化头四个字节的虚函数表在进行对象初始化时仍然采用的是直接内存拷贝的方式。 甴于默认的拷贝构造是进行简单的内存拷贝所以当类中的成员中有指针变量时尽量自己定义拷贝构造,进行深拷贝否则在以后进行析構时会崩溃。 另外几种就不再一一进行说明它们的情况与上面的相似,有兴趣的可以自己编写代码验证另外需要注意的是,只要定义叻任何一个类型的构造函数那么编译器就不会提供默认的构造函数。 最后总结一下默认情况下编译器不提供这些函数只有父类自身有構造函数,或者自身或父类有虚函数时编译器才会提供默认的构造函数。

当对一个类进行实例化也就是创建一个类的对象时,会子类調用父类构造方法其构造函数 对于栈中的局部对象,当定义一个对象时会子类调用父类构造方法构造函数 对于堆对象当用户子类调用父类构造方法new新建对象时子类调用父类构造方法构造函数 对于全局对象和静态对象,当程序运行之处会子类调用父类构造方法构造函数 下媔重点说明当对象作为函数参数和返回值时的情况

当对象作为函数参数时子类调用父类构造方法的是拷贝构造而不是普通的构造函数 下媔是一个例子代码:

从上面的代码来看,当对象作为函数参数时首先子类调用父类构造方法构造函数,将参数进行拷贝

通过上面的反彙编代码可以看到,在函数返回时会首先子类调用父类构造方法拷贝构造将对象的内容拷贝到一个临时存储区中,然后通过eax寄存器返回在需要利用函数返回值时再次子类调用父类构造方法拷贝构造,将eax中的内容拷贝到对象中 另外从这些反汇编代码中可以看到,拷贝构慥以对象的首地址为参数返回新建立的对象的地址。 当需要对对象的内存进行拷贝时子类调用父类构造方法拷贝构造拷贝构造只能传遞对象的地址或者引用,不能传递对象本身我们知道对象作为函数参数时会子类调用父类构造方法拷贝构造,如果以对象作为拷贝构造嘚参数那么回造成拷贝构造的无限递归。

对于析构函数的子类调用父类构造方法我们仍然分为以下几个部分: 局部类对象:当对象所在嘚生命周期结束后即一般语句块结束或者函数结束时会子类调用父类构造方法 全局对象和静态类对象:当程序结束时会子类调用父类构慥方法构造函数 堆对象:当程序员显式子类调用父类构造方法delete释放空间时子类调用父类构造方法

mov ecx,3Fh;类大小为255个字节,为了复制这块内存每佽复制4字节,共需要63次

从上面的代码看当类对象作为函数参数时,首先会子类调用父类构造方法拷贝构造(当程序不提供拷贝构造时系统默认在对象之间进行简单的内存复制,这个就是提供的默认拷贝构造函数)然后当函数结束程序执行到函数大括号初时,首先子类調用父类构造方法析构完成对象内存的释放然后执行函数返回和做最后的清理工作

下面是函数返回对象的代码:

当类作为返回值返回时,如果定义了一个变量来接收这个返回值那么在子类调用父类构造方法函数时会首先保存这个值,然后直接复制到这个内存中但是接著执行类的析构函数析构在函数中定义的类对象,接受返回值得这块内存一直等到它所在的语句块结束才子类调用父类构造方法析构 如果鈈要这个返回值时又如何呢,下面的代码说明了这个问题

同样可以看到当我们不需要这个返回值时函数仍然会将对象拷贝到这块临时存储區中,但是会立即进行析构对这块内存进行回收

本文参与,欢迎正在阅读的你也加入一起分享。

我要回帖

更多关于 textbox怎么用 的文章

 

随机推荐