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

《C++Primer》第十八章 用于大型程序工具

如果异常发生在构造函数中,则当前对象可能只构造了一部分(有些成员已经初始化了,另一些成员在异常发生前也许还没有初始化)。即使某个对象构造了一部分,我们也要确保已构造成员能被正确地销毁。...Endangered 最后初始化Panda 1.2 继承构造函数与多重继承 在C++11新标准中,允许派生一个或几个基类中继承构造函数。...using Base2::Base2; // Base2继承构造函数 // 补救方法: 如果一个类多个基类中继承了相同构造函数, 则这个类必须为该构造函数定义它自己版本...,多重继承派生类如果定义了自己拷贝/赋值构造函数赋值运算符,则必须在完整对象上执行拷贝、移动或赋值操作。...拷贝构造函数创建对象对应部分 最后执行Panda拷贝构造函数 合成移动构造函数、拷贝赋值运算符工作机理类似。

1.3K20

《C++Primer》第十五章 面向对象程序设计

派生类可以继承基类成员,但是对于net_price这种与类型相关操作必须对其重新定义,即派生类需要对这些操作提供自己新定义以覆盖override基类继承而来旧定义 在C++中,基类必须把两种成员函数区分开...新标准允许派生类显式地注明它使用某个成员函数覆盖了它继承函数,做法是添加一个关键字override 2.1 派生构造函数 尽管在派生对象中含有基类继承而来成员,但是派生类并不能直接初始化这些成员...尽管语法上来说我们可以在派生构造函数体内给它共有或受保护基类成员赋值,但最好不要这么做。 2.3 继承与静态成员 如果基类定义了一个静态成员,则在整个继承体系中只存在该成员唯一定义。...; 我们既不能移动也不能拷贝B对象,如果B派生类希望它自己对象能被移动和拷贝,则派生类需要自定义相应版本构造函数,在这一过程中派生类需要考虑如何移动或者拷贝其基类部分成员。...和构造函数赋值运算符不同是,析构函数只负责销毁派生类自己分配资源。如前所述,对象成员是被隐式销毁,类似的派生对象基类部分也是自动销毁

1.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

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

,放到c++类里面,其实就是实现了代码重用,即派生类要使用基类属性和方法,就不用再重新编写代码,这种可以算是实现继承。...,先调用基类构造函数,再调用派生构造函数派生对象销毁时,先调用派生析构函数,再调用基类析构函数。...构造函数里面”初始化列表”和”赋值区别 初始化列表和赋值区别如下: 初始化列表只会调用一次构造函数,其实就是变量声明时初始化; 赋值会先调用构造函数,再调用一次赋值函数,它相当于在声明后,又进行了赋值...,这很显然是不正确,因为执行类B构造函数时要执行一次类A构造函数,执行类C时候也要执行一次类A构造函数,析构函数同理,到这里问题还不大,毕竟可以编译和运行。...防止类对象被拷贝和赋值,无非是禁止类对象调用拷贝构造函数赋值函数,在c++11以后有三种方法: 拷贝构造函数赋值函数定义为私有的; 私有继承基类; 构造函数后面加=delete,这是c++11新增用法

90910

【C++】继承

现在,我们就能真正理解 “派生对象可以直接赋值给基类对象/基类指针/基类引用,而不产生类型转换” 是什么意思了 – 派生对象赋给基类对象时中间不会参数临时变量,所以基类对象可以直接引用/指向派生对象...派生默认成员函数 派生默认成员函数规则如下: 1、派生构造函数必须调用基类构造函数初始化基类那一部分成员。...如果基类没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用基类构造函数。 2、派生拷贝构造函数必须调用基类拷贝构造完成基类拷贝初始化。...,其中派生类成员函数对内置类型和自定义类型处理和普通类成员函数一样,但是父类成员变量必须由父类成员函数来处理; 2、派生析构函数非常特殊,它不需要我们显式调用父类析构函数,而是会在子类析构函数调用完毕后自动调用父类析构函数...,所以我们需要在子类构造函数初始化列表处显式调用父类构造来完成父类成员初始化; (2)子类拷贝构造必须调用父类拷贝构造完成对父类成员拷贝,同时这里还存在子类对象赋值给父类对象 (切片) 问题

85400

C++:43---派生类向基类转换、静态动态类变量

二、转换本质 派生类可以转换为基类本质是: ①为什么派生类可以转换为基类:派生基类而来,因此派生类中包含了基类方法和成员。...此时基类可以通过指针或引用指向派生类(相当于将派生基类中继承那部分方法和成员绑定到基类上了,相当于派生类被截断了),然后基类就可以将派生类假装是一个基类对象来使用(调用其中成员/方法) ②为什么基类不能转换为派生类...main() { A *a; B b; C c; a = &b; //正确 a = &c; //错误 return 0; } ②B不论以什么方式继承于A,B成员函数和友元中可以将派生对象向基类转换...//错误,num属于B,而A内不含有此成员 return 0; } 七、其他情境下类型转换 当我们用一个派生对象为一个基类对象初始化或赋值时,只有该派生对象基类部分会被拷贝、移动或赋值...对象 A a3(b); //拷贝构造,使用B类类型b对象,b对象内容被截断 return 0; } 赋值运算符时类型转换 #include using namespace:

1.6K10

c++面试题

析构函数调用次序是先派生析构后基类析构,也就是说在基类析构调用时候,派生信息已经全部销毁了定义一个对象时先调用基类构造函数、然后调用派生构造函数;析构时候恰好相反:先调用派生析构函数...允许在派生类中对基类函数重新定义。 纯虚函数作用:在基类中为其派生类保留一个函数名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数功能,一般不能直接被调用。...可选其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新对象,也就是说,连续两个<<操作符实际上是针对不同对象!这无法让人接受。...定义上来说: 重载:是指允许存在多个同名函数,而这些函数参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 重写:是指子类重新定义父类虚函数方法。...接口重用:为了类在继承和派生时候,保证使用家族中任一类实例某一属性时正确调用。

1.2K11

【C++】从零开始认识继承

寓意把派生类中父类那部分切来赋值过去。 基类对象不能赋值派生对象。 基类指针或者引用可以通过强制类型转换赋值派生指针或者引用。但是必须是基类指针是指向派生对象时才是安全。...构造函数 首先派生成员可以分为以下几种:父类成员 , 子类成员 , 内置类型,自定义类型。 对于子类成员,规则和普通类一样(内置类型不做处理,自定义类型调用其构造函数)。...,内置类型会不处理,自定义类型会调用其构造函数。...默认生成赋值构造也是差不多逻辑:对于子类成员,规则和普通类一样(内置类型不做处理,自定义类型调用其赋值构造函数 operator=) 那要是存在深拷贝,需要我们来自己写: class Student...派生析构函数会在被调用完成后自动调用基类析构函数清理基类成员。因为这样才能保证派生对象先清理派生类成员再清理基类成员顺序。 派生对象初始化先调用基类构造再调派生构造

5610

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

我们一样可以自定义所需类型转换运算符,方法是一个没有返回类型也没有形参必须定义为成员函数operator type() const函数 尽管编译器对一个对象一次只进行一次自定义类型转换,但这个转换还可以放在一次内置转换之前或之后...,指重新实现了一个名称和参数都一样方法 重载 overload,指对一个同名方法进行了几种不同参数实现 可以将一个派生对象转换为基类对象,此时派生类独有的部分将被截断,其基类部分被处理而派生类部分被忽略...定义方法是在声明函数时候函数体类似显式默认构造写法改写为=0,只能对虚函数使用这个写法 友元只对被声明类有效,友元基类或派生类都不是友元 某个类对其继承来成员访问权限受到两个因素影响:...因此除了重载虚函数外最好不要让名称同名 派生类可以覆盖基类重载函数,但是如果派生类希望基类重载几个函数都在派生类中可见的话:一种方法是不覆盖任何一个重载函数或将所有重载函数都进行一次覆盖;另一种方法是为需要重载函数名使用...using语句并不要指定形参列表,可以将所有重载函数都加入派生作用域中 继承体系中,最关键是基类通常需要定义一个虚析构函数,这样我们才能动态分配体系中对象,确保delete时能够执行正确析构函数版本

1.7K10

深入理解 Java 中 final 关键字

final 方法 final 也可以声明方法,Java 里用 final 修饰符去修饰一个方法唯一正确用途就是表达:这个方法原本是一个虚方法,现在通过 final 来声明这个方法不允许在派生类中进一步被覆写...from final class } 内存模型中 final 对于 final 变量,编译器和处理器都要遵守两个重排序规则: 构造函数内,对一个 final 变量写入,与随后把这个被构造对象引用赋值给一个变量...写重排序规则可以保证,在对象引用对任意线程可见之前,对象 final 变量已经正确初始化了,而普通变量则不具有这个保障;读重排序规则可以保证,在读一个对象 final 变量之前,一定会先读这个对象引用...如果 final 变量类型是引用型,那么构造函数内,对一个 final 引用对象成员域写入,与随后在构造函数外把这个被构造对象引用赋值给一个引用变量,这两个操作之间不能重排序。...,而不需要额外同步开销 总结 final 关键字可以用于成员变量、本地变量、方法以及类 final 成员变量必须在声明时候初始化或者在构造器中初始化,否则就汇报编译错误 不能够对 final 变量再次赋值

42730

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

,而不是按构造函数说明中冒号后面的顺序,所以num成员被赋是一个随机值,并不是想赋16,因为这个时候,成员age还没有被赋值,age内存空间中是一个随机值。...尽管这个答案不是完全答案,但我接受它作为一个正确答案。(如果你想知道更详细答案,仔细读一下Saks文章吧。)如果应试者能正确回答这个问题,我将问他一个附加问题:下面的声明都是什么意思?...由于C++提供默认拷贝构造函数只是对对象进行浅拷贝复制。如果对象数据成员包括指向堆空间指针,就不能使用这种拷贝方式,此时必须自定义拷贝构造函数,为创建对象分配堆空间。...《C++程序设计教程》P352 在例子中并没有声明派生类GraduateStudent构造函数,根据类实现机制,派生对象创建时,将执行其默认构造函数。...编译时就能确定哪个重载函数被调用,称为先期联编。 多态性可可以简单概括为“一个借口,多种方法”,在程序运行过程中才决定调用函数。 虚函数就是允许被其子类重新定义成员函数

75191

【C++】继承

然后呢,我还想定义一个学生类,那此时我还需要重新0开始定义一个类吗? 当然也是可以。但是像这种情况,使用继承就会非常香。 为什么这种情况可以使用继承呢?...那这里不可见是什么意思呢? 这里不可见是指基类私有成员还是被继承到了派生对象中,但是语法上限制派生对象不管在类里面还是类外面都不能去访问它。...基类可以赋值派生类吗? 是不行,基类对象不能赋值派生对象。...类对象并运行程序,子类我们没有实现拷贝构造,我们看看默认生成是什么行为?...如果基类没有默认构造函数,则必须在派生构造函数初始化列表阶段显示调用。 那其实这里感觉就有点像子类里面有一个父类自定义类型成员一样。

10210

C++面试题

这时候如果析构函数不是虚函数,就不能正确识别对象类型从而不能正确调用析构函数。...而且,只要它是最后构造函数调用,那么在这个对象生命期内,VPTR将保持被初始化为指向这个VTABLE, 但如果接着还有一个更晚派生构造函数被调用,这个构造函数又将设置VPTR指向它 VTABLE...VPTR状态是由被最后调用构造函数确定。这就是为什么构造函数调用是基类到更加派生类顺序另一个理由。...C++空类有哪些成员函数 默认构造函数、 默认拷贝构造函数、 默认析构函数、 默认赋值运算符,以及取址运算符和 const 取址运算符。 10. 虚函数表属于类还是对象?虚函数表什么内存空间?...因此,这种方法不可以。 当对象建立在栈上面时,是由编译器分配内存空间,调用构造函数构造对象。当对象使用完后,编译器会调用析构函数来释放栈对象所占空间。编译器管理了对象整个生命周期。

1.7K42

深入理解ES6之——JS类相关知识

作为以及公民类 在编程中,能被当做值来使用就成为一级公民,意味着他能作为参数,能作为函数返回值,能用来给变量赋值。js函数就是一级公民。...屏蔽类方法 派生类中方法总是会屏蔽基类同名方法。例如:你可以将getArea()方法添加到Square类,以便重新定义它功能。...null 生成器函数 继承内置对象 在ES6类继承中,this值会先被基类创建,随后才被派生构造器所修改。...结果是this初始就拥有作为基类内置对象所有功能,并能正确接收与之关联所有功能。...:任意能返回内置对象实例方法,在派生类上却会自动返回派生实例。

42220

C++:52---多重继承

三、构造函数初始化顺序 构造基类顺序与派生列表中基类出现顺序有关,而与构造函数初始化列表中基类初始化顺序无关 派生构造自己之前同样需要构造基类对象。...using继承基类构造函数概念 在C++11标准中,允许派生一个或几个基类中继承构造函数。...“const std::string&”构造函数,因此编译器产生错误 为了解决上面的错误,必须自己显式地在本类中定义可能会产生二义性构造函数,这种方法就是我们所说覆盖。...使用非合成版本 与单一继承原理一致,多重继承派生类如果定义了自己拷贝/赋值构造函数赋值运算符,则必须在完整对象上执行拷贝、移动、赋值操作(也就是说建议要拷贝、移动、赋值属于基类部分数据)...使用合成版本 如果派生类没有定义自己拷贝/赋值构造函数赋值运算符,那么在执行这些操作时将会自动调用基类拷贝/赋值构造函数赋值运算符 七、基类与派生类型转换 与单一继承原理一致,可以将一个派生赋值给一个基类

90830

C++基础-继承

公有继承中,派生类是基类一种,比如,我们可以说,金枪鱼是鱼一种。 阅读介绍继承文献时,“…继承而来”(inherits from)和“派生而来”(derives from)术语含义相同。...如果基类包含重载构造函数,需要在实例化时给它提供实参,则创建派生对象时,可以使用初始化列表,并通过派生构造函数调用合适基类构造函数。...3.3 赋值关系 如下三条关系根本原因在 3.1 节中已讲述。 派生对象可以赋值给基类对象,反之则不行。 因为派生对象数据成员比基类对象数据成员多。...将派生对象赋值给基类对象,基类对象能够得到所有数据成员值。反过来,将基类对象赋值派生对象派生对象中部分数据成员无法取得合适值,因此赋值失败。...将派生对象赋值给基类引用,基类引用表示派生对象基类部分,多余部分舍弃即可。反过来,显然不行。

95720

C++基础——C++面向对象之类、对象与继承基础总结(类和对象概念、构造函数与析构函数、this指针、继承)

类用于指定对象形式,它包含了数据表示法和用于处理数据方法。类中数据和方法称为类成员,函数在一个类中被称为类成员(C++中类跟Java语言实在太像了)。         ...类中实例化对象有两种方法栈中实例化、堆中实例化。 下面自定义一个people类,看下如何自定义类和使用对象。...people1,并为people1中成员变量赋值,然后调用对象speak()方法打印输出; 接着,堆中实例化一个对象people2(使用关键字 new 都是堆中实例化对象),这种方式需要开辟内存...当创建一个类时,不用重新编写新数据成员和成员函数,只需指定新建类(派生类)继承了一个已有的类(基类)成员即可,在 Qt 里大量使用这种特性, 当 Qt 里类不满足自己要求时,我们可以重写这个类...,给出了构造函数和析构函数区别,并总结了this指针使用方法,有了以上基础后,进一步总结了C++语言三大特征之一继承基本概念,并结合实例演示了继承使用方法

76250

类继承

比如我们这个派生类中就有单科成绩数据成员 现在我们为他加上构造函数和成员函数 派生构造函数不能直接访问基类数据,那要怎么设置基类数据呢,那就是调用基类方法,也就是说我们要写派生构造函数必须使用基类构造函数...构造函数,同时创建一个Student对象并嵌套在xiaostudent对象中,完成对xiaostudent对象创建 当然基类构造函数也是可以不用显式调用,则程序会调用默认构造函数 ,也就是说除非使用默认构造函数否则需要调用正确基类构造函数...总结以下要点 首先会创建基类对象 派生构造函数应通过成员初始化列表将基类信息传递给基类构造函数 派生构造函数应初始化派生类新增数据成员 释放对象顺序与创建对象顺序相反,首先执行派生析构函数...这也在小学生派生构造函数给出 xiaostudent也是一个构造函数,但他不通过初始化列表赋值,他调用了基类拷贝构造函数,将我们传递进来基类对象赋值给 我们派生类内嵌套基类对象 如果我们省略初始化列表...,因此不能使用st或者pst来调用派生方法,不可以将基类对象和地址赋值派生类引用和指针。

14520

第 18 章 用于大型程序工具

在 C++11新标准中,允许派生一个或几个基类中继承构造函数,但是如果多个基类中继承了相同构造函数(即形参列表完全相同),则程序将产生错误。...中继承构造函数 using Base2::Base2; // Base2中继承构造函数 }; // 正确写法如下,派生类要定义该形式、自己版本构造函数 // 另外,因为自己显式定义了构造函数...自定义拷贝/赋值构造函数赋值运算符都需要显式调用基类相应成员来完成派生对象拷贝、移动和赋值操作。只有当派生类使用是合成版本函数时,才会自动对齐基类部分执行相应操作。...含有虚基类对象构造顺序与一般顺序稍有区别:首先使用提供给最低层派生构造函数初始值初始化该对象虚基类子部分,接下来按照直接基类在派生列表中出现次序依次对其进行初始化。...虚对象按照它们在派生列表中出现顺序左向右依次构造,然后按照声明顺序逐一构造其他非虚基类。对象销毁顺序与构造顺序正好相反。

89420

C++ Primer Plus习题及答案-第十三章

创建和删除派生对象时,构造函数和析构函数调用顺序是怎样? 按照派生顺序调用构造函数,最早构造函数最先调用。调用析构函数顺序正好相反。 5....如果基类和派生类定义了同名方法,当派生对象调用该方法时,被调用将是哪个方法? 调用派生方法,它取代基类定义。仅当派生类没有重新定义方法或使用作用域解析运算符时,才会调用基类方法。 7....更普通说,如果对于派生类成员来说,默认赋值正确,则应定义赋值运算符。 8. 可以将派生对象地址赋给基类指针吗?可以将基类对象地址赋给派生类指针吗? 可以将派生对象地址赋给基类指针。...仅当派生类定义了转换运算符(即包含将基类引用作为唯一参数构造函数)或使用基类为参数赋值运算符时,相反赋值才是可能。 10. 假设定义了一个函数,它将基类对象引用作为参数。...按值传递对象将调用复制构造函数,由于形参是基类对象,因此将调用基类复制构造函数,复制构造函数已基类引用为参数,该引用可以将指向作为参数传递派生对象,最终结构是,将生成一个新基类对象,其成员对应于派生对象基类部分

72590

C++ 重载运算符 继承 多态 (超详细)

用非类A类型值为类A对象赋值时(当然,这种情况下我们可以不提供相应赋值运算符重载函数,而只提供相应构造函数,如更有重载函数会优先调用重载后赋值运算符)。...构造函数执行顺序:基类→对象成员→派生类; (6)派生构造函数和析构函数使用原则 基类构造函数和析构函数不能继承 派生类是否定义析构函数与所属基类无关 如果基类没有定义构造函数或是定义无参构造函数...如果基类无无参构造函数派生类必须定义构造函数 如果派生类基类为连续基类继承,每个派生类只负责直接基类构造 (7)派生类析构函数构造函数执行顺序相反,派生-----对象-----基类 (8)赋值兼容原则...赋值兼容应注意问题: 指向基类指针可以指向公有派生对象,但不允许指向它私有派生对象。...声明为指向基类对象指针,当其指向公有派生对象时,只能用它来直接访问派生类中基类继承来成员,而不能直接访问公有派生定义成员。

1K21
领券