首页
学习
活动
专区
圈层
工具
发布

C++ 核心编程

在方法结束后就进行了释放。第一次钓鱼执行结果时正确的结果,时因为我编译器做了保留。而在一二次调用的时候内存进行了释放。 这里test2中为什么返回的是静态变量引用可以使用,不报错。...函数调用作为左值 实际上test方法中是返回a的引用,即相当于将a进行赋值1000 引用的本质 本质:引用的本质在c++内部实现是一个指针常量....如果加载时上面的void func(int& a)方法,是不合法的。引用必须有一个合法的内存空间,而这里10是在常量区里面。...而一旦用户定义,则对象在销毁时自动调用。 不同点:虽然他俩都为公开类型。构造可以重载,有多个兄弟,而析构却不能重载,但它可以是虚函数,一个类只能有一个析构函数。...Animal,并且调用speak 纯虚函数和抽象类 在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容。

2.6K20

什么?CC++面试过不了?因为你还没看过这个!

在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构时,如 list。...alloca:在栈上申请内存。程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca 不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca 不宜使用在必须广泛移植的程序中。...合法,但: 必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的 必须保证调用 delete this 的成员函数是最后一个调用...this 的成员函数 必须保证成员函数的 delete this 后面没有调用 this 了 必须保证 delete this 后没有人使用了 定义只在堆(栈)生成对象类 只能在堆上 方法:将析构函数设置为私有...能在栈上 方法:将 new 和 delete 重载为私有 原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象

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

    C++学习——虚函数与纯虚函数

    它可以在派生类中重新定义,以形成不同版本。只有在程序的执行过 程中,依据指针具体指向哪个类对象,或依据引用哪个类对象,才能确定激活哪一个版本,实现动态聚束。...3、虚函数必须是类的一个成员函数,不能是友元函数,也不能是静态 的成员函数。 4、在派生类中没有重新定义虚函数时,与一般的成员函数一样,当调 用这种派生类对象的虚函数时,则调用其基类中的虚函数。...2、把函数名赋值为0,本质上是将指向函数体的指针值赋为初值0。与定义空函数不一样,空函数的函数体为空,即调用该函数时,不执行任何动作。没有在派生类重新定义这种虚函数之前,是不能调用这种纯虚函数的。...3、使用这种指针变量来调用成员函数时,必须指明调用那一个对象的成员函数, 这种指针变量是不能单独使用的。用对象名引用。 4、由于这种指针变量不是类的成员,所以用它只能调用公有的成员函数。...5、当一个成员函数的指针指向一个虚函数,且通过指向对象的基类指针或对象的 引用来访问该成员函数指针时,同样地产生运行时的多态性。

    5.7K20

    【C++】模板继承多态

    static静态成员方法 (错误) 虚析构函数 (可以) 析构函数调用时,对象是存在的 基类的虚函数是虚函数,派生类的析构函数自动变成虚函数 当基类指针(引用)指向堆上new出来的派生类对象的时候...在类的构造函数当中,调用虚函数,也是静态绑定(构造函数中调用其他 函数(虚)不会发生动态绑定) 如果不是通过指针或者引用变量来调用虚函数,那就是静态绑定。...compare compare(1.2,5.1); 推导出double实例化一个 comparedouble> 动态(运行时期)的多态: 在继承结构中,基类指针(引用)指向派生类对象,通过该指针...(引用)调用同名覆盖方法(虚函数),基类指针指向哪个派生类对象,就会调用哪个派生类对象的同名覆盖方法。...如果尝试转换失败,dynamic_cast 将返回一个空指针(对指针进行转换)或引发 std::bad_cast 异常(对引用进行转换)。

    46710

    C语言与C++面试知识总结

    在以下场景中,经常需要显式引用 this 指针: 为实现对象的链式引用; 为避免对同一对象进行赋值操作; 在实现一些数据结构时,如 list。...alloca:在栈上申请内存。程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca 不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca 不宜使用在必须广泛移植的程序中。...合法,但: 必须保证 this 对象是通过 new(不是 new[]、不是 placement new、不是栈上、不是全局、不是其他对象成员)分配的 必须保证调用 delete this 的成员函数是最后一个调用...this 的成员函数 必须保证成员函数的 delete this 后面没有调用 this 了 必须保证 delete this 后没有人使用了 定义只在堆(栈)生成对象类 只能在堆上 方法:将析构函数设置为私有...能在栈上 方法:将 new 和 delete 重载为私有 原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象

    5.6K41

    C++区别于其他语言的知识点总结

    //对象已经有了 = 内存已经分配 构造函数在编译时就会被调用,即使main()函数为空。...C++使用virtual才能实现多态,C#使用virtual或者abstract才能实现多态 一旦父类方法声明为虚方法(virtual),则子类的同名方法(形参、类型必须完全相同)自动变成虚方法。...//在方法前加virtual关键字即成为虚方法 virtual void size() = 0 //纯虚函数 //C++中具有纯虚函数的类,就是抽象类 //C++只能这样定义抽象类 //抽象类 单纯做模板...//普通函数根据对象声明类型 虚函数通过对象实际类型 同名方法(编译时多态): 同一个类的同名方法:函数名重载 父子类同名的方法(形参的个数,类型必须相同) 如果是非多态的方法(普通方法):...子类隐藏父类的方法 如果是多态的方法(虚方法):子类覆盖父类的方法 //在父类析构函数之前加virtual //父类的虚析构函数,解决子类对象赋值给父类指针后,当delete父类指针时,无法调用子类析构函数的问题

    1.2K100

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

    3、指针和引用的区别 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向...引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。 不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针。...虚表:虚函数表的缩写,类中含有virtual关键字修饰的方法时,编译器会自动生成虚表 虚表指针:在含有虚函数的类实例化对象时,对象地址的前四个字节存储的指向虚表的指针 ? ?...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...,而Windows + VS2019在值返回的情况下发生拷贝构造函数,引用返回方式则不发生拷贝构造函数。

    2.5K10

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

    而对于有虚函数的类来说,每个对象都会保存一个指向虚函数表的指针,该指针在64位的机器上占8Byte。...在面向对象方法中,一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法);也就是说,每个对象可以用自己的方式去响应共同的消息所谓消息,就是调用函数,不同的行为就是指不同的实现...纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...在基类中实现纯虚函数的方法是在函数原型后加=,如下所示: virtual void funtion()=0; 含有纯虚函数的类称为抽象类,它不能生成对象。...在C++中,,构造函数不能声明为虚函数,这是因为编译器在构造对象时,必须知道确切类型,才能正确地生成对象;其次,在构造函数执行之前,对像并不存在,无法使用指向此对像的指针来调用构造函数。

    1.8K10

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

    3、指针和引用的区别 指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向...引用一旦初始化之后就不可以再改变(变量可以被引用为多次,但引用只能作为一个变量引用);指针变量可以重新指向别的变量。 不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针。...虚表:虚函数表的缩写,类中含有virtual关键字修饰的方法时,编译器会自动生成虚表 虚表指针:在含有虚函数的类实例化对象时,对象地址的前四个字节存储的指向虚表的指针 ? ?...在构造时,根据对象的类型去初始化虚指针vptr,从而让vptr指向正确的虚表,从而在调用虚函数时,能找到正确的函数 (3)所谓的合适时机,在派生类定义对象时,程序运行会自动调用构造函数,在构造函数中创建虚表并对虚表初始化...,而Windows + VS2019在值返回的情况下发生拷贝构造函数,引用返回方式则不发生拷贝构造函数。

    3.1K40

    c++11面试宝典(final,delete,deault,explicit,lambda表达式)

    注:只能修饰类和虚函数 2.override 作用: 修饰子类虚函数时,编译时编译器会自动检测该函数是否在父类中被重写。...注意: override只能修饰子类的虚函数 好处: 可以帮助我们更好的检查出是否在重写父类虚函数的过程中出来什么问题。...,可以使用std::sort方法。...在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。 注意: 在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。..._price << endl; } return 0; } 运行结果: lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量

    84120

    类和对象(万字总结!深度总结了类的相关知识)(上)

    静态实例化在栈上分配内存,动态实例化在堆上分配内存。 构造函数用于在实例化时初始化对象,析构函数在对象销毁时释放资源。 每个对象有自己独立的成员变量,但共享同一类的成员函数。...7.3 空类的大小 在C++中,即使类中没有任何成员变量,空类的大小也不是 0。为了确保每个对象都有唯一的地址,C++规定空类的大小为 1 字节。...返回对象的引用:可以使用this指针在成员函数中返回当前对象的引用,以实现链式调用(如在操作符重载时)。...this指针的存储位置与当前的函数调用栈和运行时有关,它通常会存储在寄存器或栈中,具体取决于编译器实现和CPU架构。 this指针可以为空吗? this指针不能为空,但它可以指向空对象。...成员函数的this指针在调用时是隐式传递的,但由于Print()函数中没有使用与对象相关的成员变量,所以this指针并未实际被解引用。

    48510

    大学C++课程提炼概括【C++笔记】

    ,默认参数在右,防止起争议 void Div(double a,double b=1.0) { } //变量的引用 #include int main( ) { int...,这里不用加都虚 //虚拟以后,c.a就是唯一的了 //多态性 //利用虚函数机制实现了“一个接口(基指针),多种方法”的完备意义的多态性(可以借此实现对象链表) //虚函数的作用,使基类的某函数内容不会过早的绑定...,内容呈现动态化,一旦有新的定义,就可以在该派生类中用虚函数调用 //虚函数要和基指针结合使用 //基指针:基类类型指针,可以指向基类,也可以指向由它的派生类抽象而来的实例,但是也只能调用基类继承过来的函数...//虚函数要和基指针结合使用(可是实现基指针指向派生类对象时,可以调用该对象重新写后的函数内容) //虚函数实现原理(每个类中都有一个虚表存放虚函数,一旦在某类被重新定义,该类虚表就会更新,指针调用的就是虚表里的函数...实际上C++的书都会推荐说C++中更习惯使用0来表示空指针而不是NULL,尽管NULL在C++编译器下就是0。

    65470

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

    接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力; 所谓多态 就是向不同对象发生同一个消息,不同的对象在接收时会产生不同的行为(即方法).   ...,不同的对象在接收时会发生不同的行为(即方法)。...虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。...3)应考虑对成员函数的调用是通过对象名还是通过基类指针或引用去访问,如果通过基类指针或引用去访问的,则应当声明为虚函数; 4)有时,在定义虚函数时,并不定义其函数,即函数体是空的。...因为在执行构造函数前对象尚未创建完成,虚函数表尚不存在,也没有指向虚函数表的指针,所以此时无法查询虚函数表,也就不知道要调用哪一个构造函数。下节会讲解虚函数表的概念。

    1.4K60

    C++ 面试必备:常见 C++ 面试题汇总及详细解析

    重写和重载的区别 重写指的是在派生类中重新定义基类的虚函数的行为。当基类中的某个虚函数在派生类中被重新定义时,如果派生类对象调用该函数,则会覆盖掉基类中的实现,执行派生类中的实现代码。...继承:通过继承机制,一个类可以从另一个类中继承某些属性和方法,并在此基础上添加新的属性和方法,从而避免了重复编写代码的冗余,提高了代码的可重用性和可维护性。...int* p = nullptr; // 初始化为空指针 在指针使用后及时置空 当指针变量不再使用时,我们应该将其置为空指针,防止误用。这样可以有效地避免产生野指针。...基类的析构函数为何要声明为虚函数? C++基类的析构函数声明为虚函数是为了确保在通过基类的指针或引用删除派生类对象时,可以正确地释放派生类对象所占用的内存。...malloc和new的区别 malloc和new都是用于动态分配内存的函数,但它们在使用方法和效果上有一些区别: 调用方式不同:malloc是C语言标准库中的函数,需要以函数调用形式调用,并且需要指定要分配的内存大小

    3.3K30

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

    ,因为我们不能确定这个指针或者引用到底指向基类对象还是派生类对象,直到运行时才能确定,这个就叫多态。...运行时多态简单来讲就是:使用基类指针或者引用指向一个派生类对象,在非虚继承的情况下,派生类直接继承基类的虚表指针,然后使用派生类的虚函数去覆盖基类的虚函数,这样派生类对象通过虚表指针访问到的虚函数就是派生类的虚函数了...析构函数是否可以为虚函数?如果可以,有什么作用? 析构函数可以是虚函数,因为它是对象结束时才调用,不影响虚表构建。...防止类对象被拷贝和赋值,无非是禁止类对象调用拷贝构造函数和赋值函数,在c++11以后有三种方法: 拷贝构造函数和赋值函数定义为私有的; 私有继承基类; 构造函数后面加=delete,这是c++11新增的用法...空类是多大? 由成员变量和是否有虚函数决定,如果类中有虚函数,那就在所有成员变量的基础上加上一个虚函数指针的大小,在64位机器中,虚函数指针为8个字节,注意计算类大小的时候要考虑字节对齐的问题。

    1.3K10

    解锁C++多态的魔力:灵活与高效的编码艺术(上)

    二、多态的使用条件 2.1 基类指针或引用 在C++的多态性中,基类指针或引用是实现多态调用的关键。通过基类指针或引用指向派生类对象,可以在运行时调用派生类的重写方法,而不依赖于对象的静态类型。...2.1.1 为什么需要基类指针或引用 在C++中,如果直接使用派生类对象,即使它重写了基类的虚函数,编译器仍然会使用静态绑定,即在编译时确定调用的函数版本。...动态绑定:在main函数中,通过基类引用和指针来调用派生类的sound方法,输出的是实际派生类的结果。...虚函数允许基类的指针或引用在运行时根据对象的实际类型调用派生类的重写方法,而不仅仅局限于基类的实现。这种机制在面向对象设计中非常重要,尤其在抽象接口、工厂模式等设计模式中广泛应用。...基类指针或引用:虚函数的多态性只能通过基类的指针或引用来调用,如果直接使用派生类对象,则编译时会使用静态绑定。

    75810

    【面试虐菜】—— JAVA面试题(2)

    然后,这个过程实际上是这样的:首先创建一个StringBuffer对象,然后用StringBuffer类的append方法追加字符串,最后对StringBuffer对象调用toString方法合成字符串返回...而引用类的传递时引用,即虚地址,例如g(new Employee())是把实际参数的虚地址传递给形式参数e,也就是说实际参数和形式参数的虚地址相同,物理上是同一个对象。...参考答案:基本数据类型传递的是值,引用类型传递的是引用,即虚地址。...是==在比较引用类型时,比较的是两个对象的虚地址,而不是内容。要比较两个对象的内容是否相同,往往需要使用equal方法,例如if(s.equals(“save”)){}。...常用方法:toString()  equals finalize() 14 Object类的equals与hashcode方法 解析:在Object类中,equals方法比较对象的引用值,也就是只有物理上是同一对象的两个引用

    90250

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

    析构:首先调用派生类析构函数,然后再调用基类析构函数 2.多态 ***公有 *** 继承 当需要同一个方法再派生类和基类中行为是不同的,或者说方法的行为应取决于调用该方法的对象——多态,多种状态 在派生类中重新定义基类...虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。...基类中 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。...,过程更加复杂,编译器必须生成能够在程序运行时选择的正确的虚方法的代码,这又 称为动态联编 静态 静态联编对函数的选择是基于指向对象的指针或者引用的类型。...值得注意的是 只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式为:指向基类的指针变量名->虚函数名(实参表)或基类对象的引用名.虚函数名(实参表) 实现动态联编需要同时满足以下三个条件:

    70020

    穿透 C++ 的语法糖,理解底层实现

    语法糖背后的底层逻辑 很多开发者认为std::move是 "转移对象" 的魔法,但本质上,std::move只是一个类型转换工具 —— 它将左值强制转换为右值,本身并不触发任何资源转移。...shipId(std::move(other.shipId)), dataSize(other.dataSize) { // 底层:直接接管other的资源,other变为空对象...,提升效率,但会导致对象内存释放延迟(需等待弱引用计数为 0),在智慧航道海量设备场景下可能增加内存占用。...),指向所属类的虚表; 动态绑定:当通过基类指针 / 引用调用虚函数时,编译器会通过对象的 vptr 找到对应的 vtable,再根据函数索引调用具体实现,这一过程在运行时完成(动态绑定)。...:通过基类指针管理子类对象时,必须声明虚析构函数,否则会导致子类资源泄漏; 静态多态替代动态多态:对于高频调用的传感器采集函数,可使用模板实现静态多态(编译期绑定),消除虚函数调用开销,比如: // 静态多态优化

    22510

    【C++篇】C++11新特性总结2

    ,这样有些场景会更高效一些,可以直接在容器空间上构造T对象。...编译器检查:如果使用了override,但实际并没有覆盖基类中的虚函数(例如,方法签名不匹配),编译器会报错。...若std::function不含目标,则成称它为空。调用空std::function的目标导致抛出std::bad_function_call异常。 它被定义在头文件中 。...double, double)> f4 = &Plus::plusd; return 0; } 5.2,bind bind 是⼀个函数模板, 对接受的可调用的对象 进行处理后返回一个可调用对象...总结:std::bind 是一个绑定器,用于将函数或可调用对象的参数绑定到特定的值上,从而创建一个新的可调用对象。它通常用于固定某些参数,使函数或可调用对象的调用更简单。

    12610
    领券