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

C++关键知识点梳理

默认构造函数没有参数,在没有定义任何构造函数的情况下,编译器会帮我们自动定义默认构造函数,否则我们定义了其他构造函数后,一定要显示定义默认构造函数;析构函数拷贝构造函数赋值构造函数访问控制和封装:this...、private三种继承方式继承父类public继承方式基类中所有 public 成员在派生类中为 public 属性;基类中所有 protected 成员在派生类中为 protected 属性;基类中所有...protected继承方式基类中的所有 public 成员在派生类中为 protected 属性;基类中的所有 protected 成员在派生类中为 protected 属性;基类中的所有 private...private继承方式基类中的所有 public 成员在派生类中均为 private 属性;基类中的所有 protected 成员在派生类中均为 private 属性;基类中的所有 private 成员在派生类中不能使用...每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)当派生类重新定义虚函数时,则将派生类的虚函数的地址添加到虚函数表中。

98530

硬核 | C++ 基础大全

无参数构造函数: 即默认构造函数,如果没有明确写出无参数构造函数,编译器会自动生成默认的无参数构造函数,函数为空,什么也不做,如果不想使用自动生成的无参构造函数,必需要自己显示写出一个无参构造函数。...在程序编译的时候,将指针和引用添加到符号表中。...而对于引用来说,它只是一块内存的别名,在添加到符号表的时候,是将"引用变量名-引用对象的地址"添加到符号表中,符号表一经完成不能改变,所以引用必须而且只能在定义时被绑定到一块内存上,后续不能更改,也不能为空...,被继承的类称为父类或者基类; 继承的特点 子类拥有父类的所有属性和方法,子类可以拥有父类没有的属性和方法,子类对象可以当做父类对象使用; 继承中的访问控制 public、protected、private...有虚表,那么它必须被设定初值; 所有上一层的基类构造函数必须被调用; 所有虚基类的构造函数必须被调用。

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

    再探虚函数

    重载函数的关键是函数参数列表——也称函数特征标。包括:函数的参数数目和类型,以及参数的排列顺序。所以,重载函数与返回值,参数名无关。...因为父类对象会在子类之前进行构造,此时子类部分的数据成员还未初始化,因此调用子类的虚函数时不安全的,故而C++不会进行动态联编; 析构函数是用来销毁一个对象的,在销毁一个对象时,先调用子类的析构函数,然后再调用基类的析构函数...所以在调用基类的析构函数时,派生类对象的数据成员已经销毁,这个时候再调用子类的虚函数没有任何意义。 ---- Q8:静态函数能定义为虚函数吗?...1、 虚函数表是class specific的,也就是针对一个类来说的,这里有点像一个类里面的staic成员变量,即它是属于一个类所有对象的,不是属于某一个对象特有的,是一个类所有对象共有的。...每一个有虚函数的类(或有虚函数的类的派生类)都有一个虚函数表,该类的任何对象中都放着该虚函数表的指针(可以认为这是由编译器自动添加到构造函数中的指令完成的)。

    87620

    「MoreThanJava」Day 5:面向对象进阶—继承详解

    其他成员将在其类定义中添加到子类。 视频观影 App 示例 Java 编程是通过创建类层次结构并从中实例化对象来完成的。您可以扩展自己的类或扩展已经存在的类。...如果您没有为类编写任何构造函数,那么将自动提供无参数构造函数 (称为默认构造函数)。 如果为一个类编写了一个构造函数,则不会自动提供默认的构造函数。...因此:如果您为类编写了额外的构造函数,那么,则还必须编写一个无参数构造函数 (供子类调用)。 在示例程序中,类 Video 包含构造函数,因此不会自动提供默认构造函数。...所以,Movie 类 super() 函数建议默认使用的构造函数 (会自动调用无参数构造函数) 会导致语法错误。...由于继承可以确保基类中所有的方法在子类中也同样有效,所以能够向基类发送的所有信息也同样可以向子类发送。例如,如果 Video 类具有一个 play() 方法, 那么 Movie 类也将同样具备。

    52210

    JavaScript 继承

    所有开发者定义的类都可作为基类。出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码,因为这些代码可以被用于恶意攻击。 选定基类后,就可以创建它的子类了。...是否使用基类完全由你决定。有时,你可能想创建一个不能直接使用的基类,它只是用于给子类提供通用的函数。在这种情况下,基类被看作抽象类。...记住,所有属性和方法都是公用的,因此子类可直接访问这些方法。子类还可添加超类中没有的新属性和方法,也可以覆盖超类的属性和方法。...因为 prototype 属性被替换成了新对象,添加了新方法的原始对象将被销毁。 注意:调用 ClassA 的构造函数,没有给它传递参数。这在原型链中是标准做法。要确保构造函数没有任何参数。...this,然后再将父类的方法添加到 this 上面(Parent.apply(this))。

    32120

    2023 跟我一起学设计模式:工厂方法模式

    如果代码其余部分与现有类已经存在耦合关系, 那么向程序中添加新类其实并没有那么容易。 这可是个好消息。 但是代码问题该如何处理呢? 目前, 大部分代码都与 卡车类相关。...但有一点需要注意:仅当这些产品具有共同的基类或者接口时, 子类才能返回不同类型的产品, 同时基类中的工厂方法还应将其返回类型声明为这一共有接口。 所有产品都必须使用同一接口。...可能最显而易见, 也是最方便的方式, 就是将这些代码放置在我们试图重用的对象类的构造函数中。 但是从定义上来讲, 构造函数始终返回的是新对象, 其无法返回现有实例。...在创建者代码中找到对于产品构造函数的所有引用。 将它们依次替换为对于工厂方法的调用, 同时将创建产品的代码移入工厂方法。 你可能需要在工厂方法中添加临时参数来控制返回的产品类型。...如果应用中的产品类型太多, 那么为每个产品创建子类并无太大必要, 这时你也可以在子类中复用基类中的控制参数。 例如, 设想你有以下一些层次结构的类。

    18230

    Qt对象树

    对象模型(对象树) 类似于c++中虚析构实现的功能一样,在释放父类对象的同时调用子类的析构函数释放子类对象 也c++调用析构函数的区别是:会先调用父类的析构函数,然后一层层往下调用子类析构,直到调用到底层子类析构...,然后再把底层子类挨个往上释放,直到基类对象被释放的时候结束,这里注意:在调用析构函数的同时会执行里面的代码 在Qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个parent到底是干什么的...当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。...这相当于,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。...QPushButton,不然Widget是基类,无法调用子类QPushButton里面的新增特性 { Q_OBJECT public: explicit myPushButton(QWidget

    47320

    在Javascript中使用面向对象的编程

    这个方法要注意的是,我们创建了一个基类对象的实例,并把它做为我们的类的构造函数的原型对象。这么做,我们所创建的所有的对象,将继承基类对象的所有成员和(方法)。...但是要注意,基类的构造函数只会被调用一次(译者注:从基类到子类的构造函数都是唯一的,即基类的构造函数)。这不像C++,基类的构造函数,对于每个继承的子类,都可以分别的调用。...一个是,当每次构造继承的类的时候,基类的构造函数都不会被调用。假如,构造函数不做太多的事情,只是初始化一些成员变量为静态的值,这个问题就不是太明显了。...这是因为,对于构造函数来说,我要把这些方法的定义,放入新创建的原型对象,而不是添加到,默认的原型对象。 ...它需要添加新的方法DeriveFrom给基类。

    96720

    【白话设计模式】去哪儿网一面:工厂方法模式

    如果代码其余部分与现有类已经存在耦合关系, 那么向程序中添加新类其实并没有那么容易。 代码问题该如何处理呢?目前, 大部分代码都与 卡车类相关。在程序中添加 轮船类需要修改全部代码。...但有一点需要注意:仅当这些产品具有共同的基类或者接口时, 子类才能返回不同类型的产品, 同时基类中的工厂方法还应将其返回类型声明为这一共有接口。 ? 所有产品都必须使用同一接口。...可能最显而易见, 也是最方便的方式, 就是将这些代码放置在我们试图重用的对象类的构造函数中。但是从定义上来讲, 构造函数始终返回的是新对象, 其无法返回现有实例。...实现方式 让所有产品都遵循同一接口。该接口必须声明对所有产品都有意义的方法。 在创建类中添加一个空的工厂方法。该方法的返回类型必须遵循通用的产品接口。 在创建者代码中找到对于产品构造函数的所有引用。...如果应用中的产品类型太多, 那么为每个产品创建子类并无太大必要, 这时你也可以在子类中复用基类中的控制参数。 例如, 设想你有以下一些层次结构的类。

    33320

    C++ 类使用规范建议

    定义:通常,只有一个参数的构造函数可被用于转换(conversion,译者注:主要指隐式转换,下文可见),例如,定义了Foo::Foo(string name),当向需要传入一个Foo对象的函数传入一个字符串时...为避免构造函数被调用造成隐式转换,可以将其声明为explicit。 优点:避免不合时宜的变换。 缺点:无。 结论:所有单参数构造函数必须是明确的。...定义:当子类继承基类时,子类包含了父基类所有数据及操作的定义。...(3)基类如果有虚函数函数,那么令析构函数为virtual。原因是保证通过基类指针能够动态的调用子类析构函数,避免内存泄露。...; (3)为避免隐式转换,需将单参数构造函数声明为explicit; (4)为避免拷贝构造函数、赋值操作的滥用和编译器自动生成,可声明其为private且无需实现; (5)仅在作为数据集合时使用struct

    1.8K20

    现代C++之手写智能指针

    2.手写unique_ptr之子类向基类转换 在上述auto_ptr基础上,我们把拷贝构造与拷贝赋值,改为移动构造与移动赋值。...现在我们考虑两种情况: (1)第一种:当我们只是在原先的移动构造上面添加template ,此时情况是移动构造变为带模板的移动构造,可以进行子类向基类转换,但是与移动构造相关的,...则调用的是默认移动构造,除非是子类向基类转换,才调用带模板的移动构造。...(2)第二种:移动构造与带模板的移动构造同时存在,可以完成子类向基类的转换,此时是满足上述生成规则,此时不会生成拷贝函数!...,但是却没有实现基类向子类的转换,例如::unique_ptr转unique_ptr。

    2.9K10

    Python入门(16)

    关于方法,它有一个特殊的参数self 与普通函数的区别:除了它隶属于某个类,在它的参数列表的开头,还需要添加一个特殊的参数 self ,但是你不用在调用该方法时为这个参数赋值,Python 会为它提供。...这同时意味着,如果你的类里面的方法没计划有参数,你依旧必须为它添加 一个self 参数 。 ?...比如,我们在 Teacher 和 Student 子类中定义了 __init__ 方法, Python 就不会自动调用基类 SchoolMember 的构造函数,必须自己显式地调用它。...相反,如果我们没有在子类中定义 __init__ 方法,Python 将会自动调用基类的该方法。 (4)、修改父类的任何功能,它将自动反映在子类中。相反,子类的修改,则不会影响到其他的子类。...比如,案例中,你可以通过简单地向 SchoolMember 类进行操作,来为所有老师与学生添加一条新的 ID 卡字段。

    85310

    C++基础知识复习

    父类的所有成员函数以及数据成员都会被子类继承 先调用父类的构造函数,再调用子类的构造函数。 ---- 先调用父类的构造函数用来初始化从父类继承来的数据。...再调用自己的构造函数,用来初始化自己定义的数据。 没有体现父类的构造函数 ,就会自动调用父类的默认构造函数。...(例如:初始值列表) 没有显示调用父类构造函数,那么会自动调用父类的默认构造函数。...如果子类重写了父类的某个虚函数,那么就在这个虚函数表中进行相应的替换 如果子类中添加的新的虚函数,就把这个虚函数添加到虚函数表中(尾部添加) 使用多重继承的虚函数表 在上面的基础上再添加一个...注意: 为了防止内存泄露,最好在基类的虚构函数上添加virtual关键字,使基类析构函数为虚函数。 纯虚函数与抽象类 什么时候使用纯虚函数?

    56410

    Google C++编程风格指南(四)之类的相关规范

    定义:通常,只有一个参数的构造函数可被用于转换(conversion,译者注:主要指隐式转换,下文可见),例如,定义了Foo::Foo(string name),当向需要传入一个Foo对象的函数传入一个字符串时...为避免构造函数被调用造成隐式转换,可以将其声明为explicit。 优点:避免不合时宜的变换。 缺点:无。 结论:所有单参数构造函数必须是明确的。...定义:当子类继承基类时,子类包含了父基类所有数据及操作的定义。...子类不能重写父类的非虚函数,当然也就不能修改其实现。基类也可能定义了一些数据成员,还要区分基类的物理轮廓(physical layout)。...(3)基类如果有虚函数函数,那么令析构函数为virtual。原因是保证通过基类指针能够动态的调用子类析构函数,避免内存泄露。

    87921

    《Effective C++》学习笔记

    条款12:复制对象时勿忘其每一个成分 复制构造函数和赋值构造函数要确保复制了对象内的所有成员变量和所有基类成分,这意味着你如果自定义以上构造函数,那么每增加成员变量,都要同步修改以上构造函数,且要调用基类的相应构造函数...如果一定要用,试着考虑无需转型的替代设计,例如为基类添加一个什么也不做的衍生类使用的函数,避免在使用时需要将基类指针转型为子类指针。...衍生类中如果声明了与基类中同名的函数(无论是虚、非虚,还是其他形式),都会掩盖掉基类中的所有同名函数,注意,是所有,包括参数不同的重载函数,都会不再可见。...此时再通过子类使用其基类中的重载函数(子类没有声明接收该参数的重载函数时),都会报错。...对于嵌套从属类型名称(即依赖于模板参数类型的一个子类型,例如迭代器),必须用typename来修饰,但不能在模板类的基类列和初始化列表中修饰基类。

    1.1K20

    C++面试题

    虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。...一般基类的虚成员函数,子类重载的时候要求是完全一致,也就是除了函数体,都要一毛一样。...而析构函数同样也是成员函数,虚析构函数也会进入虚表,唯一不同的是,函数名并不要求一致,而且,你如果不写,编译器也会帮你生成,而且如果基类有virtual,编译器也会默认给子类添加。...而子类析构函数具有析构掉基类的职责,所以不会造成内存泄漏。而基类并不知道自己的子类。 4. 构造函数和析构函数能抛出异常吗? 不能。 5. 多继承存在什么问题?如何消除多继承中的二义性?...C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型。简单的讲,RTTI是在一个类的虚函数表里面添加了一个新的类型条目。

    1.7K42

    AWT的Container容器

    首先,所有的AWT编程相关的类都放在java.awt包以及它的子包中。在AWT编程中,有两个基类:Component和MenuComponent。...Container作为容器根类,提供了如下方法来访问容器中的组件 方法签名 方法功能 Component add(Component comp) 向容器中添加其他组件 (该组件既可以是普通组件,也可以...在AWT中,通过 Panel 类实例化面板对象。调用面板对象的 add()方法将有关联的组件添加到面板上,实现组件的分组;然后,该面板对象作为其他容器对象的 add()方法的参数,放置到其他容器中。...Panel类的构造方法 Panel类的构造方法主要有如表 所列举的两种重载形式。 Panel的默认布局是流式布局(FlowLayout),即从左到右依次排列组件,当宽度不足时自动换行。...通过构造方法传入一个字符串参数作为窗口的标题。

    11810

    设计模式系列 | 工厂方法模式

    如果代码其余部分与现有类已经存在耦合关系,那么向程序中添加新类其实并没有那么容易。 这可是个好消息。但是代码问题该如何处理呢?目前,大部分代码都与卡车类相关。在程序中添加轮船类需要修改全部代码。...不过,每向对话框中添加一个新的工厂方法,你就离抽象工厂模式更近一步。我们将在稍后谈到这个模式。 // 创建者类声明的工厂方法必须返回一个产品类的对象。创建者的子类通常会提供 // 该方法的实现。...可能最显而易见,也是最方便的方式,就是将这些代码放置在我们试图重用的对象类的构造函数中。但是从定义上来讲,构造函数始终返回的是新对象,其无法返回现有实例。...实现方式 让所有产品都遵循同一接口。该接口必须声明对所有产品都有意义的方法。 在创建类中添加一个空的工厂方法。该方法的返回类型必须遵循通用的产品接口。 在创建者代码中找到对于产品构造函数的所有引用。...如果应用中的产品类型太多,那么为每个产品创建子类并无太大必要,这时你也可以在子类中复用基类中的控制参数。 例如,设想你有以下一些层次结构的类。

    8210

    SqlAlchemy 2.0 中文文档(六)

    类可以像混合类一样添加到层次结构中(参见 Mixin and Custom Base Classes),允许子类仅从特殊类扩展: class SomeAbstractBase(Base): __...可以以与 mixin 相同的方式将类添加到层次结构中(请参阅 Mixin and Custom Base Classes),从而允许子类仅从特殊类扩展: class SomeAbstractBase(Base...扩充基类 除了使用纯混合类之外,本节中的大多数技术也可以直接应用于基类,用于适用于从特定基类派生的所有类的模式。...TimestampMixin 在其类基类中的声明式类将自动包含一个名为 created_at 的列,该列对所有行插入应用时间戳,以及一个名为 updated_at 的列,该列不包含默认值以示例为目的(...这些列构造始终从源混合类或基类复制,因此可以将相同的混合类/基类应用于任意数量的目标类,每个目标类都将有自己的列构造。

    38710
    领券