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

C++构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 不能调用 构造函数 )

初始化 , 所有的构造函数都要进行初始化操作 ; 构造函数 不能调用 构造函数 ; 一、匿名对象 生命周期 1、匿名对象 生命周期 说明 调用 类名(构造函数参数) 创建的是 匿名对象 ; 匿名对象...; 2、代码示例 - 匿名对象 生命周期 下面的代码 , fun 函数 , 调用 Student(18, 180) 代码 , 创建 Student 类型的匿名对象 , 匿名对象的生命周期 只存在于...二、构造函数 调用 构造函数 ---- 1、构造函数 不能调用 构造函数 构造函数 调用 构造函数 是危险行为 ; 构造函数 调用 构造函数 , 并不会为本对象进行初始化操作 ; 构造函数调用方式..., 天然就会创建一个 匿名对象 , 如果 没有变量 接收 这个 匿名对象 , 该匿名对象 本行表达式执行完毕后 , 就会被销毁 ; 2、代码示例 - 构造函数调用构造函数 下面的代码 , 先定义...执行 Student 的构造函数" << endl; } 然后 , 无参的 构造函数 , 调用 有参构造函数 ; // 构造函数 调用 构造函数 是危险行为 Student() { /

18120

《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

() { Corgi co; return 0; } 分析代码: 代码,用派生类创建了一个派生类的对象构造函数调用的时候,会先去构造类的成分,然后才会去构造派生类的从成分,这就意味着,会先去调用类的构造函数...类的构造函数最后会去执行count_Dog函数,问题就出现在这里,上面说了,构造函数构造期间,类的virtual函数不会下降到派生,也就是说即使我们创建的对象属于派生类的,但是调用类的构造函数期间...这种现象根本的原因在于:派生对象调用类的构造函数期间,由于是类先构造,那么在此期间,此时的对象被视为是类的对象,并且派生类的成分并没有初始化,因此C++的做法是视它们不存在,这样才能保证安全。...,通过调用了createdogs函数,创建了类Dog的匿名对象,也就是调用类的构造函数,然后进入了count_Dog函数,最后再次去调用派生类的构造函数的主体!...做法就是派生的拷贝构造函数和赋值重载调用类的拷贝构造和赋值函数

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

C++系列笔记(五)

为什么需要虚构函数 上面的代码如果加入析构函数释放内存,对于使用new自由储存区实例化的派生对象,如果将其赋值给类指针,并通过该指针调用delete,将不会调用派生类的析构函数,这可能导致资源未释放...new自由存储区实例化的,还是以局部变量的方式实例化的,构造函数和析构函数调用顺序都相同。...抽象类和纯虚函数 不能实例化的类被称为抽象类,这样的类只有一个用途,那就是从它派生出其他类。 C++,要创建抽象类,可声明纯虚函数。...注意:C++关键字virtual的含义随上下文而异(我想这样做的目的很可能是为了省事),对其含义总结如下: 函数声明,virtual意味着当类指针指向派生对象时,通过它可调用派生类的相应函数。...而构造函数只能创建固定类型的对象,不具备多态性,因此C++不允许使用虚复制构造函数

65130

《挑战30天C++入门极限》图例实解:C++类的继承特性

图例实解:C++类的继承特性   整个c++程序设计全面围绕面向对象的方式进行,类的继承特性是c++的一个非常非常重要的机制,继承特性可以使一个新类获得其父类的操作和数据结构,程序员只需新类增加原有类没有的成分...一旦成功定义派生类,那么派生类就可以操作类的所有数据成员包括是受保护型的,上面代码的a.EditSC(100,4); 就是例子,甚至我们可以构造派生对象的时候初始化他们,但我们是不推荐这么做的...由上面的例程我们知道Car类是Vehicle类的派生类(子类),c++规定,创建派生对象的时候首先调用类的构造函数初始化类成员,随后才调用派生构造函数。   ...,但按照c++的规定首先应该调用构造函数构造成员,在这里类成员的构造是通过Vehicle(speed,total),来实现的。   ...许多书籍对于派生对象的复制这一知识点多是空缺的,为了教程的易读性,我还是决定说一下复制过程容易出错的地方,Car b=a;是派生对象复制的语句,通过前面教程的学习我们我们知道,类对象的复制是通过拷贝构造函数来完成的

38620

轻松搞定面试的“虚”

是否每个类的析构函数都要设置成virtual?是否可以将析构函数设置成内联函数。 这样做是为了当用一个类的指针删除一个派生类的对象时,派生类的析构函数会被调用。...(动态绑定是根据对象的动态类型而不是函数名,调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?) 6.是否可以析构函数或者构造函数调用函数构造函数不要调用函数。...构造的时候,虚函数是非虚,不会走到派生,既是采用的静态绑定。...显然的是:当我们构造一个子类的对象时,先调用类的构造函数构造子类类部分,子类还没有构造,还没有初始化,如果在类的构造调用函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以...C++是不可以构造父类对象部分的时候调用子类的虚函数实现。

65420

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

,先调用类的构造函数,再调用派生类的构造函数派生对象销毁时,先调用派生类的析构函数,再调用类的析构函数。...4. c++多态有什么作用 个人理解,其实就是实现了接口的重用,同样的接口,派生类与类不同的实现。 5....运行时多态简单来讲就是:使用类指针或者引用指向一个派生对象非虚继承的情况下,派生类直接继承类的虚表指针,然后使用派生类的虚函数去覆盖类的虚函数,这样派生对象通过虚表指针访问到的虚函数就是派生类的虚函数了...防止类对象被拷贝和赋值,无非是禁止类对象调用拷贝构造函数和赋值函数c++11以后有三种方法: 拷贝构造函数和赋值函数定义为私有的; 私有继承类; 构造函数后面加=delete,这是c++11新增的用法...由成员变量和是否有虚函数决定,如果类中有虚函数,那就在所有成员变量的基础上加上一个虚函数指针的大小,64位机器,虚函数指针为8个字节,注意计算类大小的时候要考虑字节对齐的问题。

89710

C++构造函数分类 ② ( 不同的内存创建类的实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同的内存创建类的实例对象 1、栈内存创建实例对象 在上一篇博客 【C++构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型的 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了...栈内存的 变量 Student s1 ; 这些都是 栈内存 创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存的实例对象销毁 ; 栈内存 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 类 的 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数

14920

C++和Java中继承的比较

然而, C++ ,有一个类森林;当我们创建一个不从另一个继承的类时,我们森林中创建了一棵新树。 以下 Java 示例显示 Test 类自动继承自 Object 类。 ...因此,我们不能改变 Java 类成员的保护级别,如果某个数据成员是公共的或受保护的,那么它在派生仍然是公共的或受保护的。与 C++ 一样,类的私有成员派生不可访问。 ...8) C++,会自动调用父类的默认构造函数,但是如果我们要调用父类的参数化构造函数,就必须使用Initializer list。...和C++一样,Java中会自动调用父类的默认构造函数,但是如果我们要调用参数化构造函数,那么就必须使用super来调用构造函数。请参阅以下 Java 示例。...派生构造函数调用

55810

后台开发:核心技术与应用实践 -- C++

同时,无论哪一种继承方式,派生是不能访问类的私有 成员的,私有成员只能被本类的成员函数所访问,毕竟派生类与类不是同一个类 构造派生类的对象时,必须对类数据成员、新增数据成员和成员对象的数据成员进行初始化...派生构造函数必须对这3类成员进行初始化,其执行顺序是这样的: 先调用构造函数; 再调用对象构造函数; 最后调用派生类的构造函数体 当派生类有多个类时,处于同一层次的各个类的构造函数调用顺序取决于定义派生类时声明的顺序...执行派生类的析构函数时,系统会自动调用类的析构函数和子对象的析构函数,对类和子对象进行清理。...虚函数实现了同一类族不同类的对象可以对同一函数调用作出不同的响应的动态多态性。 C++规定,当某个成员函数被声明为虚函数后,其派生的同名函数都自动成为虚函数。...C++,,构造函数不能声明为虚函数,这是因为编译器构造对象时,必须知道确切类型,才能正确地生成对象;其次,构造函数执行之前,对像并不存在,无法使用指向此对像的指针来调用构造函数

1.3K10

当类构造与析构的时候...

构造/析构函数的执行顺序 继承机制对象之间如何转换? C++类成员的访问权限和继承权限问题 如何禁止程序自动生成拷贝构造函数?...C++struct和class的区别 什么时候会调用默认构造函数 1、当不使用任何初始值定义一个类的非静态变量时,会调用该类的默认构造函数。...赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。...析构的时候,如果有类,且类的析构函数是虚函数,则先调用自己的构造函数,再调用类的构造函数。 如果类的析构函数不是虚函数,则调用类的析构函数。 ---- 继承机制对象之间如何转换?...三种继承方式 ① 若继承方式是public,类成员派生的访问权限保持不变,也就是说,的成员访问权限,派生仍然保持原来的访问权限; ② 若继承方式是private,类所有成员派生的访问权限都会变为私有

61920

C++实现不能被继承的类——终结类

解决方法 基本思路:由于任何派生类的对象创建的时候,都必需派生类的构造函数调用父类的构造函数。所以,只要类的构造函数子类无法被访问,那么就阻止了该类被继承,实现终结类。...间接实例化方法是:类定义一个公有的静态成员函数,由这个函数来完成对象的初始化工作。...) { if(m_pInstance == NULL) //判断是否第一次调用 m_pInstance = new CSingleton()...一个类如果被虚拟继承,那么创建它的孙子类的对象时,该类的构造函数需要单独被调用。此时,如果该类的构造函数在孙子类的构造函数无法访问,那么就实现了类的子类不能被继承。...,当FinalClassChild试图继承FinalClass的时候,FinalClassChild的构造函数需要调用FinalParent的构造函数,而FinalParent的构造函数FinalClass

1.7K20

python3 入门 (四) 类与继承

Python 类 Python的类提供了面向对象编程的所有基本功能:类的继承机制允许多个类,派生类可以覆盖的任何方法,方法可以调用的同名方法。 对象可以包含任意数量和类型的数据。...python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。...__div__除运算 __mod__求余运算 __pow__称方 __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++...python中继承的一些特点: 1:继承类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造亲自专门调用。使用super()....区别于调用普通函数时并不需要带上self参数 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到逐个查找。

892120

C++终结类

由于任何派生类的对象创建的时候,都必需派生类的构造函数调用父类的构造函数。所以,只要类的构造函数子类无法被访问,那么就阻止了该类被继承,实现终结类。...间接实例化方法是:类定义一个公有的静态成员函数,由这个函数来完成对象的初始化工作。...) { if(m_pInstance == NULL) //判断是否第一次调用 m_pInstance = new CSingleton()...一个类如果被虚拟继承,那么创建它的孙子类的对象时,该类的构造函数需要单独被调用。此时,如果该类的构造函数在孙子类的构造函数无法访问,那么就实现了类的子类不能被继承。...,当FinalClassChild试图继承FinalClass的时候,FinalClassChild的构造函数需要调用FinalParent的构造函数,而FinalParent的构造函数FinalClass

50420

C++之面向对象的三个基本特征

静态多态性与动态多态性 静态多态性 通过函数重载实现的。缺乏灵活。 动态多态性是通过虚函数实现的。  C++函数:就是类声明函数是虚拟的,并不是实际存在的函数,然后派生才正式定义此函数。...如果在派生没有对类的虚函数重新定义,则派生类简单地继承其直接类的虚函数。 定义一个指向对象的指针变量,并使它指向同一类族需要调用函数对象。...需要说明;有时定义的非虚函数会在派生类中被重新定义(如例12.1的area函数),如果用类指针调用该成员函数,则系统会调用对象类部分的成员函数;如果用派生类指针调用该成员函数,则系统会调用派生对象的成员函数...虚析构函数 析构函数的作用是在对象撤销之前做必要的“清理现场”工作;当派生类的对象从内存撤销时,一般先调用派生类的析构函数,再调用类的析构函数。...C++构造函数用于创建对象时进行初始化工作,不能声明为虚函数

1.1K60

C++:28 --- C++内存布局(上)

与成员变量不同的是,通过派生重新定义函数,一个派生类可以覆盖,或者说替换掉类的函数定义。...6 特殊成员函数 构造函数和析构函数 正如我们所见,构造和析构过程,有时需要初始化一些隐藏的成员变量。...最坏的情况下,一个构造函数要执行如下操作: 1 * 如果是“最终派生类”,初始化vbptr成员变量,调用类的构造函数; 2 * 调用非虚类的构造函数 3 * 调用成员变量的构造函数 4 * 初始化虚函数表成员变量...5 * 执行构造函数,程序所定义的其他初始化代码 (注意:一个“最终派生类”的实例,一定不是嵌套在其他派生类实例类实例) 所以,如果你有一个包含虚函数的很深的继承层次,即使该继承层次由单继承构成...“最终派生类”,调用类的析构函数(按照相反顺序) VC++,有虚类的类的构造函数接受一个隐藏的“最终派生类标志”,标示虚是否需要初始化。

99320

C++编程经验(4):不要在构造函数和析构函数中使用虚函数

类的构造过程,虚函数调用从不会被传递到派生。代之的是,派生对象表现出来的行为好象其本身就是类型。不规范地说,类的构造过程,虚函数并没有被"构造"。...简单的说就是,子类对象类子对象构造期间,调用的虚函数的版本是类的而不是子类的。...如果在类的构造过程对虚函数调用传递到了派生类, 派生对象当然可以参照引用局部的数据成员,但是这些数据成员其时尚未被初始化。这将会导致无休止的未定义行为和彻夜的代码调试。...,新版的编译器会拒绝你构造函数调用了虚函数,然后帮你调整了方向。。。...一旦进入到类的析构器,该对象即变为一个对象C++各个部分(虚函数,dynamic_cast运算符等等)都这样处理。

98830

C++面向对象程序设计》✍千处细节、万字总结(建议收藏)「建议收藏」

B类对象构造... 析构B类对象... 析构A类对象... 可见:构造函数调用严格地按照先调用类的构造函数,后调用派生类的构造函数的顺序执行。...,子对象名n(参数表n) { 派生类新增成员的初始化语句 } 定义派生对象时,构造函数调用顺序如下: 调用类的构造函数,对类数据成员初始化。...使用虚类机制时应该注意以下几点: 如果在虚定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构,所有直接或间接的派生类都必须在构造函数的成员初始化列表列出对虚构造函数调用...建立一个对象时,如果这个对象中含有从虚类继承来的成员,则虚类的成员是由最远派生类的构造函数通过调用类的构造函数进行初始化的。该派生类的其他类对虚构造函数调用都被自动忽略。...若同一层次同时包含虚类和非虚类,应先调用类的构造函数,再调用非虚类的构造函数,最后调用派生构造函数。 对于多个虚类,构造函数的执行顺序仍然是先左后右,自上而下。

3.1K40

领悟面向对象就离开发应用不远了(类提高)有你对面向对象的所有疑问,爆肝1w字

类信息传递给对象 派生构造函数应该初始化派生类新增的数据成员 流程就像我上张图片一样,程序首先调用构造,再调用派生构造。...析构:首先调用派生类析构函数,然后再调用类析构函数 2.多态 ***公有 *** 继承 当需要同一个方法再派生类和类中行为是不同的,或者说方法的行为应取决于调用该方法的对象——多态,多种状态 派生重新定义类...虚函数函数源于c++的类继承,是多态的一种。c++,一个类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写的成员函数。... 可以类中将被重写的成员函数设置为虚函数,其含义是:当通过类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用函数,而非指针的类型。... C++,要创建抽象类,可声明纯虚函数

50420

硬核 | C++ 基础大全

函数相关(虚函数表,虚函数指针),虚函数的实现原理 首先我们来说一下,C++多态的表象,类的函数前加上 virtual 关键字,派生重写该函数,运行时将会根据对象的实际类型来调用相应的函数...,也称为某个类为派生类的主类 查看派生是否有重写的虚函数, 如果有,就替换成已经重写的虚函数地址;查看派生是否有自身的虚函数,如果有,就追加自身的虚函数到自身的虚函数。...也就是说构造派生类的类部分是,编译器会认为这就是一个类类型的对象,然后调用类类型的虚函数实现,并没有按照我们想要的方式进行。即对象派生构造函数执行前并不会成为一个派生对象。...如果有多个类,则构造函数调用顺序是某类派生表中出现的顺序,而不是它们成员初始化表的顺序。 成员类对象构造函数。...派生构造函数,所有的虚类及上一层类的构造函数调用对象的 vptr 被初始化; 如果有成员初始化列表,将在构造函数体内扩展开来,这必须在 vptr 被设定之后才做; 执行程序员所提供的代码;

1.2K10

C++基础-继承

a, b) {}; Derived(int a, string b) : Base(a, b) {}; }; 1.3 派生调用构造函数 派生调用构造函数有三种形式: 如果类有默认构造函数...,派生构造函数会隐式调用类默认构造函数,这由编译器实现,不需编写调用代码; 如果类没有默认构造函数,即类提供了重载的构造函数,则派生构造函数通过初始化列表来调用构造函数,这属于显式调用。...这种方式是必需的,否则编译器会试图调用类默认构造函数,而类并无默认构造函数,编译会出错; 派生构造函数,使用 ::Base() 形式显示调用构造函数。...和类普通函数调用方式不同,派生调用类普通函数的形式为 Base::Function()(需要指定类名)。...如果类包含重载的构造函数,需要在实例化时给它提供实参,则创建派生对象时,可以使用初始化列表,并通过派生类的构造函数调用合适的构造函数

95220
领券