首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我们在派生类中编写空的复制构造函数时会发生什么?

当我们在派生类中编写空的复制构造函数时,会发生以下情况:

  1. 继承基类的复制构造函数:如果派生类没有显式定义复制构造函数,编译器会自动生成一个默认的复制构造函数。这个默认的复制构造函数会调用基类的复制构造函数来完成基类对象的复制。
  2. 默认成员初始化:如果派生类的复制构造函数是空的,那么派生类对象的成员变量会按照其类型的默认构造函数进行初始化。这意味着如果派生类的成员变量是基本类型或具有默认构造函数的类对象,它们将被初始化为默认值。
  3. 浅拷贝:如果派生类的复制构造函数是空的,那么派生类对象的成员变量将会进行浅拷贝。浅拷贝意味着只是简单地将源对象的成员变量的值复制给目标对象的对应成员变量。这可能导致问题,特别是当派生类的成员变量包含指针或动态分配的资源时,可能会导致浅拷贝问题。

总结起来,当在派生类中编写空的复制构造函数时,会继承基类的复制构造函数,成员变量会按照默认构造函数进行初始化,并且进行浅拷贝。为了避免浅拷贝问题,通常需要在派生类中显式定义复制构造函数,并在其中进行深拷贝操作,确保派生类对象的完整复制。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Effective C++》读书笔记(2):构造析构赋值运算

款5、了解C++默认编写并调用哪些函数 通常情况下,如果代码没有声明构造函数、拷贝构造函数、拷贝运算符、析构函数,编译器会在需要时创建他们,但这往往只能满足编译器需求,很可能无法满足程序需求...这样一个指向派生类基类指针析构时,如果析构函数不是虚函数,则直接调用基类析构函数,那么派生类获取资源未释放,则会造成内存泄漏。...而析构函数是虚函数时则先调用对应派生类析构函数,再调用基类析构函数,资源全部释放。...进入析构函数派生类部分呈未定义值,对象类型是基类,调用是基类函数。 总而言之,构造函数与析构函数函数行为有特殊变化;为了避免出错,不要在其过程中使用虚函数。...因此,必须仔细地复制所有派生类成员,并调用基类拷贝操作来复制基类成员。

13730

读完某C++神作,我只记下了100句话

假设p是指针,delete p;时,后面一定要p=NULL将p指向 cin cout cerr 都是iostream类型对象。...insert push可能导致迭代器失效,编写循环将元素插入到vector deque时,必须更新迭代器。size()返回个数,empty()返回布尔值。...即使定义了其他构造函数,也会合成复制构造函数【能够复制数组】。类成员有指针一般需要显示定义复制构造函数。 声明而不定义成员函数是合法,但是使用将导致链接失败。...合成析构函数并不删除指针成员指向对象。即使编写了自己析构函数,合成析构函数仍然运行。 默认构造函数不全,会调成员默认构造函数复制构造函数不全就不行了。 使用计数是管理智能指针类通用技术。...派生类继承基类访问控制标号【何种方式继承】无论是什么,不影响派生类使用基类成员,但影响使用派生类用户访问基类成员。类使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。

1.4K20

【笔记】《Effective C++》条款1-25

STL所有容器都没有虚函数 C++11后引入了final关键字可以用来中断类后续继承行为 程序析构时候, 会从最深处开始析构, 逐步调用析构函数, 因此基类虚析构需要一个定义, 可以是定义...close函数来执行和析构同样行为, 这样用户就能自己处理可能发生析构异常, 同时依然要给真正析构用try-catch包裹起到双保险作用 9 绝不在构造和析构过程调用virtual函数 派生类构造期间...析构函数尽管调用顺序相反但是思路一致 所以不要在析构/构造过程调用虚函数 补偿方法是将需要让派生类执行函数以非虚函数形式写好, 然后将其所需变量通过构造函数构造初值列中进行传递...., 最好令重载赋值运算符以引用形式返回*this 这只是个协议, 但最好遵守 11 operator=处理"自我赋值" 对象存在指针申请空间时, 赋值运算符我们一般都会释放旧空间, 然后创建一份和待复制内存相同内存...这种方法缺点是如果new时候发生异常, 此时当前对象指针已经被释放, 那么这个对象就会留下一个错误指针 备份指针: 一开始对指针进行备份, 然后new一个复制内存, 没有异常发生时才去释放原先内存

98630

c++类和继承面试点25连问

以上三种情况都必须使用初始化列表而不能在构造函数中进行赋值。 10. 什么情况下要使用虚继承? 多重继承时需要使用虚继承,一般我们多重继承时使用虚继承来防止二义性问题。...答案是不可以,构造函数是不能声明为virtual,这与虚函数机制有关,虚函数是存放在虚表,而虚表是构造函数执行过程才建立构造函数声明为virtual就会陷入到是先有鸡还是先有蛋尴尬境地,...构造函数里面是否可以调用虚函数 可以调用,因为虚函数表是在编译期建立调用构造函数时,首先就会初始化虚函数指针,那我们就知道了虚函数地址,当然可以调用虚函数了。 17....类大小为1个字节。 22. new一个类时候发生什么 new其实就是申请动态内存,而一个类只有虚指针和成员变量才需要内存,所以new一个类就是给虚指针和成员变量申请内存空间。 23....,结合我们知道,如果使用了指针,就会发生段错误,那这里肯定也会发生段错误,但实际上编译执行后并没有产生错误,print函数被正确执行了,这就很尴尬了,这是为什么呢?

90410

【笔记】《C++Primer》—— 第三部分:类设计者工具

我们很多时候希望我们通过将基类指针指向派生类,然后可以动态调用派生类函数,这时我们可以将基类对应函数写为虚(virtual)函数来实现,此时发生称为动态绑定 派生类可以继承多个基类,称为多继承...,派生类一般构造函数开始地方调用基类构造函数,让基类来初始化自己成员 静态类型是变量本身代码类型,在编译时决定,动态类型是变量在内存对象类型,在运行时才能决定。...,对于实现内容我们一样可以使用=default简化 如果基类基本操作函数不可访问或被删除,则派生类对应成员是被删除因为我们无法使用基类来操作那些成员 C11我们可以用using重用基类定义构造函数...,写法和15.6指明重载基类函数一样,效果与定义一个构造函数然后列表调用基类构造函数一致 和普通函数using不同,对构造函数using不会改变构造函数访问级别 基类构造函数中有默认实参时...,那些可变参数部分称为参数包,由省略号...标记 可变参数模板函数通常是一种递归函数,一般我们编写时候都会递归地分析包内容并调用直到终止,将包内容分解成元素称为包扩展 包扩展一种用法是用来扩展提取输入参数

1.7K10

《逆袭进大厂》之C++篇49问49答(绝对干货)

,对该类进行实例化时,构造函数执行时会对虚表指针进行初始化,并且存在对象内存布局最前面。...拷贝构造函数为private时:语句3和语句4在编译时会报错 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错 C++直接初始化与复制初始化区别:https://blog.csdn.net...构造子类对象时,会先调用父类构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类虚表;调用子类构造函数时,为子类对象初始化虚表指针,令它指向子类虚表 (4)派生类对基类函数没有重写时...,派生类虚表指针指向是基类虚表;派生类对基类函数重写时,派生类虚表指针指向是自身虚表;派生类中有自己函数时,自己虚表中将此虚函数地址添加在后面 这样指向派生类基类指针在运行时...,完成对象初始化工作 复制构造函数用于复制本类对象 转换构造函数用于将其他类型变量,隐式转换为本类对象 《浅谈C++几种构造函数》:https://blog.csdn.net/zxc024000

2.5K40

《逆袭进大厂》之C++篇49问49答

,对该类进行实例化时,构造函数执行时会对虚表指针进行初始化,并且存在对象内存布局最前面。...拷贝构造函数为private时:语句3和语句4在编译时会报错 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错 C++直接初始化与复制初始化区别:https://blog.csdn.net...构造子类对象时,会先调用父类构造函数,此时,编译器只“看到了”父类,并为父类对象初始化虚表指针,令它指向父类虚表;调用子类构造函数时,为子类对象初始化虚表指针,令它指向子类虚表 (4)派生类对基类函数没有重写时...,派生类虚表指针指向是基类虚表;派生类对基类函数重写时,派生类虚表指针指向是自身虚表;派生类中有自己函数时,自己虚表中将此虚函数地址添加在后面 这样指向派生类基类指针在运行时...,完成对象初始化工作 复制构造函数用于复制本类对象 转换构造函数用于将其他类型变量,隐式转换为本类对象 《浅谈C++几种构造函数》:https://blog.csdn.net/zxc024000

1.9K10

【C++】继承

派生类构造函数只能调用基类构造函数来初始化基类那部分成员,不能在自己构造函数里面初始化基类成员,值得注意是,如果基类有默认构造函数,那我们不需要管基类成员初始化工作,只要把派生类自己成员构造函数里面初始化即可...拷贝构造函数构造不同,必须在派生类拷贝构造初始化列表处显示调用基类拷贝构造,完成基类成员复制传参时有人可能会有疑问,调用基类拷贝构造该如何将子类基类成员提取出来呢?...复制重载和拷贝构造有一点不一样,由于复制重载函数基类和子类函数名相同,所以调用基类复制重载时必须指定基类域,否则会导致死循环调用子类复制重载,最终导致堆栈溢出。...所以说,派生类其他三个默认成员函数都必须我们自己手动调用基类对应默认成员函数,但是析构函数不需要我们自己调用,编译器子类析构调用结束后会自动调用基类析构。 5...._name,那就会出错,因为什么成员都没有存储,发生越界访问。

65210

学过 C++ 你,不得不知这 10 条细节!

析构函数 析构函数 可以发现在进入 operator== 函数时,发生了「复制构造函」,离开该函数作用域后发生了「析构函数」。...因为 C++ 规定,对象成员变量初始化动作发生在进入构造函数本体之前,构造函数内,都不算是被初始化,而是被赋值。...这个构造函数(成员初值列)避免了这个问题,只会发生了一次复制构造函数,本例 m_Name 以 name 为初值进行复制构造,m_Score 以 score 为初值进行复制构造。...---- 2 构造/析构/赋值运算 细节 04:了解 C++ 默默编写并调用哪些函数 当你写了如下类: class Student { }; 编译器就会它声明,并且这些函数都是 public 且...// 析构函数 Student stu2(stu1); // 复制构造函数 stu2 = stu1; // 赋值操作符函数 编译器为我们函数,来说说这些函数做了什么

70720

C++之面向对象语法笔记

值传递 //为什么这里只调用了析构函数,没有调用构造函数?...拷贝构造函数通常用于: 通过使用另一个同类型对象来初始化新创建对象。 复制对象把它作为参数传递给函数复制对象,并从函数返回这个对象。 对拷贝,C++ String源码,最能体现。...C++多态性用一句话概括就是:基类函数前加上virtual关键字,派生类重写该函数,运行时将会根据对象实际类型来调用相应函数。...发生动态多态条件: 继承 父类引用或者指针指向子类对象 函数重写 重载(overload):相同作用域内,函数名称相同,参数或常量性(const)不同相关函数称为重载。...调用发生时,编译器进行重载决议时根据调用所提供参数来选择最佳匹配函数。 重写(override):派生类重写基类同名同参数同返回值函数(通常是虚函数,这是推荐做法)。

1.5K40

《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)

通常我们习惯直接使用new、malloc 等申请内存,这样做缺点在于:由于所申请内存块大小不定,频繁使用时会造成大量内存碎片并进而降低性能。...1) 浅复制 :只是拷贝了基本类型数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制内存地址,如果原地址对象被改变了,那么浅复制出来对象也会相应改变...main函数开始执行时,编译器会将我们操作系统运行状态,main函数返回地址、main参数、mian函数变量、进行依次压栈; main函数开始调用func()函数时,编译器此时会将main函数运行状态进行压栈...但是对象a空间还在呀(析构之前),既然拷贝构造函数,实际上就是把a对象内容复制一份到b,那么为什么我们不能直接使用a空间呢?...这样就避免了新空间分配,大大降低了构造成本。这就是移动构造函数设计初衷; 2) 拷贝构造函数,对于指针,我们一定要采用深层复制,而移动构造函数,对于指针,我们采用浅层复制

2.3K40

C++重要知识点小结---3

两个指针指向同一个动态创建对象,删除就会发生错误。 3.类成员函数重载、覆盖和隐藏区别?    ...C++类,默认产生哪些类成员函数?... c程序,const用法主要有定义常量、修饰函数参数、修饰函数返回值等3个用处。 c++程序,它还可以修饰函数定义体,定义类某个成员为常态函数,即不改变类数据成员。...46 } 剖析:   能够准确无误地编写出String类构造函数、拷贝构造函数、赋值函数和析构函数面试者至少已经具备了C++基本功60%以上!   ...在这个类包括了指针类成员变量m_data,包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数,这既是对C++程序员基本要求,也是《Effective C++》特别强调条款。

86661

构造与析构时候...

C++struct和class区别 什么时候会调用默认构造函数 1、不使用任何初始值定义一个类非静态变量时,会调用该类默认构造函数。...A a; 2、类B含有类A对象,并且使用类B默认构造函数时,会调用类A默认构造函数。...---- 深拷贝与浅拷贝 浅复制 :只是拷贝了基本类型数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制内存地址,如果原地址对象被改变了...---- 成员初始化列表概念,为什么用它会快一些? 构造函数,不在函数体内对成员变量赋值,而是构造函数花括号前面使用冒号和初始化列表赋值。...三种继承方式 ① 若继承方式是public,基类成员派生类访问权限保持不变,也就是说,基类成员访问权限,派生类仍然保持原来访问权限; ② 若继承方式是private,基类所有成员派生类访问权限都会变为私有

62120

C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

通常我们习惯直接使用new、malloc申请内存。 这样做缺点在于所申请内存块大小不定,频繁使用时会造成大量内存碎片并进而降低性能。...派生类创建对象时候会调用基类构造函数,但是如果基类构造函数是虚函数的话,派生类构造函数又会把基类构造函数覆盖,所以无法进一步执行而出错。...拷贝构造函数为private时:语句3和语句4在编译时会报错。 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错。 31、初始化和赋值区别?...将析构函数声明为虚函数实现多态时,当用基类操作派生类析构时防止只析构基类而不析构派生类状况发生,要将基类析构函数声明为虚函数。...复制构造函数用于复制本类对象。 转换构造函数用于将其他类型变量,隐式转换为本类对象。 40、静态变量什么时候初始化?

1.9K20

《逆袭进大厂》第三弹之C++提高篇79问79答

因为C++语言机制保证了,一个对象创建时候,自动调用构造函数对象超出作用域时候会自动调用析构函数。所以,RAII指导下,我们应该使用类来管理资源,将资源和对象生命周期绑定。...1) 拷贝构造函数作用就是用来复制对象使用这个对象实例来初始化这个对象一个新实例。 2) 参数传递过程到底发生什么?...说说 1) 有时候我们会遇到这样一种情况,我们用对象a初始化对象b后对象a我们就不在使用了,但是对象a空间还在呀(析构之前),既然拷贝构造函数,实际上就是把a对象内容复制一份到b,那么为什么我们不能直接使用...这就是移动构造函数设计初衷; 2) 拷贝构造函数,对于指针,我们一定要采用深层复制,而移动构造函数,对于指针,我们采用浅层复制; 3) C++引入了移动构造函数,专门处理这种,用a初始化b后,...把你知道都说一说 1) 构造函数构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针构造函数初始化; 2)

2.2K30

硬核 | C++ 基础大全

拷贝构造函数: 拷贝构造函数函数参数为对象本身引用,用于根据一个已存在对象复制出一个新该类对象,一般函数中会将已存在对象数据成员值一一复制到新创建对象。...当我们定义一个派生类对象时,编译器检测该类型有虚函数,所以为这个派生类对象生成一个虚函数指针,指向该类型函数表,这个虚函数指针初始化是构造函数完成。...也就是说构造派生类基类部分是,编译器会认为这就是一个基类类型对象,然后调用基类类型函数实现,并没有按照我们想要方式进行。即对象派生类构造函数执行前并不会成为一个派生类对象。...深拷贝和浅拷贝区别(举例说明深拷贝安全性) 出现类等号赋值时,会调用拷贝函数未定义显示拷贝构造函数情况下, 系统会调用默认拷贝函数-即浅拷贝,它能够完成成员一一复制。...哪些函数不能是虚函数 构造函数构造函数初始化对象,派生类必须知道基类函数干了什么,才能进行构造有虚函数时,每一个类有一个虚表,每一个对象有一个虚表指针,虚表指针构造函数初始化; 内联函数,内联函数表示在编译阶段进行函数替换操作

1.2K10

C++设计类注意事项

构造函数用来创建新对象,它是不能被派生类继承派生类需要定义自己构造函数,并在初始化列表调用基类构造函数: SubClass::SubClass(int a, int b):BaseClass(...和普通构造函数一样,如果你没定义复制构造函数,编译器将提供一个,旦最好显式地自己定义一个,对于一些用new初始化成员,自行用深复制来做复制,否则编译器提供只是简单复制删除时会出问题。...定义派生类赋值操作符重载函数时,要显式地函数通过::来调用基类赋值操作符,来操作基类成员,毕竟派生类很多时候无法直接访问到基类成员,只能通过调用基类公开方法来访问,而且也不能通过初始化列表方式来调用...按值与按引用传递对象 通常如果函数参数是对象,最好按引用来传递,一是为了提高效率,毕竟按值传递需要复制一个对象,这就要调用复制构造函数,用完了再调用析构函数,这很费时间,尤其是类比较大时候。...虚函数 前面也提高过,用virtual修饰类一个函数原型可以令其变成虚函数(虚方法)。只需要在原型时修饰,定义不用再次修饰。 用virtual修饰函数派生类也会自动成为虚函数

37820

【旧文重发 | 06】IC基础知识

但是,结构是整体式类型,声明结构时会分配必要内存。类是动态类型,一旦声明了一个类,就只能将一个类句柄引用为null。内存分配仅在创建该类实际对象时发生。...构造函数是类特殊成员函数,每当创建该类实例时,构造函数就会自动调用。C++,它与类具有相同名称。SystemVerilog,它作为new()函数实现。 [109] 什么是析构函数?...与构造函数相反,对象结束其生命周期,如对象所在函数已调用完毕时,系统会自动执行析构函数。...深度复制情况下,还将复制A所有值(即其数据成员a和b),而不是“objA”内存句柄。 [112] 什么是OOP虚方法? 虚方法是基类声明成员方法,并且可以由派生类重新定义。...要创建虚方法,基类方法声明之前要加上关键字virtual。派生类重新定义基类方法这种方式也称为方法重写。使得调用方法时,是根据对象类型而不是句柄类型调用函数

1.1K20

【笔记】《Effective C++》条款26-55

, 异常, 分支等等原因, 我们需要无端背负它们, 无谓构造, 然后无谓地析构 因此我们应该尽量延后变量定义, 甚至直到我们能给它们初始化实参, 将其写在其它函数构造序列为止 循环中变量是特殊情况...(name-hiding), 至于这两个名称类型是否相同并不被考虑 这是非常危险特性, 如下图派生类mf3函数会将基类两个mf3一起进行遮掩, 无论基类那两个函数类型和形式是什么 因此对于公有继承来说..., 令用户只修改核心部分, 但利用总接口来使用 NVI手法需要允许用户修改私有的虚函数, 这恰好是C++"派生类可以重新定义继承来私有虚函数, 因为继承而来函数与基类无关"这个特性应用 派生类需要使用基类一些内容时虚函数也会被写为...45 运用成员函数模板接受所有兼容类型 模板之间并没有什么类似继承关系固有关系, 无法自动继承类之间进行隐式转换, 智能指针类通过底层转型来模拟这种关系 方法是编写用于指针间类型转换构造模板,...称为成员函数模板(member function template) 智能指针类编写了非explicit构造函数, 自身底层是T类型指针时, 接受一个U类型指针作为构造函数参数, 然后通过原始指针本身转换和继承形式将

88930
领券