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

计算机考研复试C语言常见面试题「建议收藏」

4、重写和重载 5、面向对象编程 (1)封装:将数据或函数集合在一个类中类。 (2)继承:子类可以继承父类的一些数据和函数。 (3)多态:运行时,可以通过指向基类的指针,调用派生类中的方法。...当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法 class A{ public: A(){} virtual void...使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域时,类会自动调用析构函数,析构函数会自动释放资源。...return 0; } 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...为什么C++默认的析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类时,可以使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。

1.7K30

你们要的C++面试题答案来了--基础篇

向上转换:指的是子类向基类的转换 向下转换:指的是基类向子类的转换 它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。...为什么C++默认的析构函数不是虚函数 考点:虚函数 析构函数 参考回答: 将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间...举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加...1.对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器;2.对于关联容器...没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露。

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

    C++基础知识

    在子进程中,成功的 fork( )调用会返回 0。在父进程中 fork( )返回子进程的 pid。如果出现错误,fork( )返回一个负值。...所以许多简单的类中没有用显式的析构函数。 如果一个类中有指针,且在使用的过程中动态的申请了内存,那么最好显示构造析构函数在销毁类之前,释放掉申请的内存空间,避免内存泄漏。...例如:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了 virtual 关键字的函数,在子类中重写时候不需要加...普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。 虚函数表 当一个类中包含被virtual 关键字修饰的成员函数时,该成员函数就成为了一个虚函数。...虚函数作用 当一个子类继承了一个含有虚函数的基类,并重写了该基类中的一个虚函数,我们就说这两个类构成多态。

    1.4K32

    C++ 万字长文第二篇---拿下字节面试

    在 C++ 中,这三种情况下拷贝构造函数会被使用: 一个对象以值传递的形式传入函数内。 一个对象以值传递的形式从函数返回。 一个对象通过另一个对象初始化。 优点:可以很容易的复制对象。...空类的大小 在 C++ 中规定类的大小不为 0,空类大小为 1,当类不包含虚函数和非静态成员时,其对象大小也为 1。若存在虚函数,则需要存储一个虚函数指针大小,在 32 位上为 4 字节。...操作方法就是在 B 和 C 的继承处加上 virtual 修饰。 虚继承底层实现一般通过虚基类指针和虚基类表实现。每个虚继承的子类都有一个虚基类指针和一个虚基类表,虚表中记录了虚基类与本类的偏移地址。...如果存在 lock 就会返回一个指向该对象的 shared_ptr,并且该对象的 shared_ptr 的引用计数加一。...如何控制一个类只能在堆或栈上创建对象 在 C++ 中创建对象的方法有两种,一种是静态建立,一个是动态建立。 静态建立由编译器为对象分配内存,通过调用构造函数实现。这种方法创建的对象会在栈上。

    1.4K20

    整理了70道C语言与C++常见问答题

    向上转换:指的是子类向基类的转换 向下转换:指的是基类向子类的转换 它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。...「注意」:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认 的。 41 在C++中,使用malloc申请的内存能否通过delete释放?...举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加...70 STL线程不安全的情况 在对同一个容器进行多线程的读写、写操作时; 在每次调用容器的成员函数期间都要锁定该容器; 在每个容器返回的迭代器(例如通过调用begin或end)的生存期之内都要锁定该容器...; 在每个在容器上调用的算法执行期间锁定该容器。

    3.1K01

    设计模式 - 模板方法模式

    模板方法 模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。...模板方法模式利用C++多态特征,在父类定义一套结构流程,其中通用部分在父类实现,子类继承父类实现差异性的接口。...总结 当希望客户端扩展某个特定算法步骤, 而不是整个算法或其结构时, 可使用模板方法模式。...undefined 模板方法将整个算法转换为一系列独立的步骤, 以便子类能对其进行扩展, 同时还可让超类中所定义的结构保持完整。 当多个类的算法除一些细微不同之外几乎完全一样时, 可使用该模式。...但其后果就是, 只要算法发生变化, 你就可能需要修改所有的类。undefined在将算法转换为模板方法时, 可将相似的实现步骤提取到超类中以去除重复代码。子类间各不同的代码可继续保留在子类中。

    32920

    C++面试题

    在一个程序中,变量有且仅有一个定义。 变量的声明:用于向程序表明变量的类型和名字。程序中变量可以声明多次,但只能定义一次。...但是,当这一系列构造函数调用正发生时,每个构造函数都已经设置VPTR指向它自己的VTABLE。...当一个元素被插入到一个STL列表(list)中时,列表容器自动为其分配内存,保存数据。考虑到要将STL容器放到共享内存中,而容器却自己在堆上分配内存。...当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。erase方法会返回下一个有效的迭代器,所以当我们要删除某个元素时,需要it=vec.erase(it);。...因此,这种方法不可以。 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。当对象使用完后,编译器会调用析构函数来释放栈对象所占的空间。编译器管理了对象的整个生命周期。

    1.7K42

    《Effective C++》学习笔记

    对于一些可能在被别的类直接调用其成员函数、值的类,最好改为暴露一个返回其类对象的引用的函数的形式,而不是暴露其类对象本身,这可以保证在函数内完成初始化,避免被调用时还没有初始化。...条款09:绝不在构造和析构过程中调用虚函数 在构造函数和析构函数中不要去调用虚函数,因为子类在构造/析构时,会调用父类的构造/析构函数,此时其中的虚函数是调用父类的实现,但这是父类的虚函数可能是纯虚函数...如果想调用父类的构造函数来做一些事情,替换做法是:在子类调用父类构造函数时,向上传递一个值给父类的构造函数。...此时再通过子类使用其基类中的重载函数(子类没有声明接收该参数的重载函数时),都会报错。...解决方法有: 在调用动作前加上“this->” 使用using声明式来在子类中声明基类的该接口 明确指出被调用的函数位于基类:Base::xxx(); 以上做法都是承诺被调用的函数一定会在各种特化基类中均声明

    1.1K20

    C++设计模式 - 模板方法模式

    模板方法 ❝模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。...❞ 模板方法模式利用C++多态特征,在父类定义一套结构流程,其中通用部分在父类实现,子类继承父类实现差异性的接口。...总结 当希望客户端扩展某个特定算法步骤, 而不是整个算法或其结构时, 可使用模板方法模式。...模板方法将整个算法转换为一系列独立的步骤, 以便子类能对其进行扩展, 同时还可让超类中所定义的结构保持完整。 当多个类的算法除一些细微不同之外几乎完全一样时, 可使用该模式。...但其后果就是, 只要算法发生变化, 你就可能需要修改所有的类。 在将算法转换为模板方法时, 可将相似的实现步骤提取到超类中以去除重复代码。子类间各不同的代码可继续保留在子类中。

    42130

    硬核 | C++ 基础大全

    如果没有显示的写拷贝构造函数,则系统会默认创建一个拷贝构造函数,但当类中有指针成员时,最好不要使用编译器提供的默认的拷贝构造函数,最好自己定义并且在函数中执行深拷贝。...所谓多态 就是向不同的对象发送同一个消息,不同对象在接收时会产生不同的行为(即方法)。即一个接口,可以实现多种方法。 多态与非多态的实质区别就是函数地址是早绑定还是晚绑定的。...析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。当撤销对象时,编译器也会自动调用析构函数。...当数据成员中没有指针时,浅拷贝是可行的。 但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针指向同一个地址,当对象快要结束时,会调用两次析构函数,而导致指野指针的问题。...链接阶段: 比如 hello 程序调用 printf 程序,它是每个 C 编译器都会提供的标准库 C 的函数。

    1.2K10

    C++复习篇

    (num);            //手工调用构造函数   return 0; } 21.父类和子类中的同名成员/函数 子类可以定义父类中的同名成员和同名函数 子类中的成员变量和函数将会隐藏父类的同名成员变量和函数...Child类为例,在编译器中,可以将子类对象退化为父类对象,从而实现子类来初始化父类,比如: Parent p1(Child()); //Child()构造函数会返回一个临时对象,从而通过子类初始化父类...能够正确调用某个同名函数是哪个类的对象 比如:当某个子类被强制转换为父类时,则父类的虚函数也会被替代为子类的,从而实现程序灵活性 一个典型的示例,如下所示: class Base //父类 { public...29.Qt中的智能指针 -QPointer 当其指向的对象被销毁时,本身会自动赋值为NULL(从而避免被多次释放和野指针) 缺点在于,该模板类析构时,不会自动摧毁所指向的对象(需要手工delete)...-QSharedPointer 带有引用计数机制,支持多个指针对象指向同一片内存(实现共享) 可以被自由地拷贝和赋值 当引用计数为0(最后一个指针被摧毁)时,才删除指向的对象(和shared_ptr类似

    1.3K20

    基础知识_Cpp

    也就是说当创建一个对象的时候,就对其进行初始化,同样当不需要该对象时,也要对其资源进行释放。...虚函数是实现运行时多态的一种机制,比如两个父类指针分别指向子类A和子类B的实例,父类指针调用虚函数时,会根据不同的子类来调用不同的函数。...当类中声明虚函数之后,编译器会在类的开始位置设置一个指针,来指向一个虚函数列表,当子类继承父类时,会一块继承这个指针,如果子类对父类中的虚函数进行了重写,就会用新函数的地址覆盖虚函数表中的旧函数。...拷贝构造函数的调用时机 用一个类的对象去初始化另一个对象时。 往函数中传递对象参数时。 从函数中返回一个对象时。...当一个类中含有对象指针时,如果把该类的一个对象复制给另一个对象,这时会导致两个对象中的指针指向同一块内存,此时一个对象销毁,可能会导致另一个对象中的指针指向的内容被销毁。

    2K30

    【C++】异常+智能指针+特殊类和类型转换

    异常对象在被catch块捕获时,catch块中通常都是用引用来作为接收异常对象类型的参数。 在C++中,当异常被抛出时,异常处理机制会确保异常对象在对应的catch块执行期间保持有效。...,所以此时继承就派出用场了,捕获异常的调用者可以用父类类型捕获所有子类中抛出的异常对象,这样的话,每个小组都可以有自己定义出来的派生类,以满足他们各自抛出异常的需求。...然后我们又自己写了一个调用链,HttpServer调用CacheMgr,CacheMgr调用SQLMgr,三个函数在满足某一较为随机的条件的情况下都会抛出异常,我们统一在main里面用基类捕获所有派生类的异常对象...然后就是实现一个静态方法,在该静态方法中完成堆对象的创建。...所以下面代码中有两种方式,第一种就是自己实现一个DelInstance接口,当我们不想在使用单例对象时,可以手动调用这个接口来释放单例对象的空间资源。

    45640

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

    析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。当撤销对象时,编译器也会自动调用析构函数。...动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源 常用的智能指针 (1) shared_ptr 实现原理:采用引用计数器的方法,允许多个智能指针指向同一个对象,每当多一个指针指向该对象时...如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。...89、C++中将临时变量作为返回值时的处理过程 首先需要明白一件事情,临时变量,在函数调用过程中是被压到程序进程的栈中的,当函数退出时,临时变量出栈,即临时变量已经被销毁,临时变量占用的内存空间没有被清空...,但是可以被分配给其他变量,所以有可能在函数退出时,该内存已经被修改了,对于临时变量来说已经是没有意义的值了 C语言里规定:16bit程序中,返回值保存在ax寄存器中,32bit程序中,返回值保持在eax

    2.4K40

    面经:C++面试精品问答题总结(一)

    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表 中删除,并将该结点的空间分配给程序,另外,...堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储 的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小 受限于计算机系统中有效的虚拟内存。...当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地 址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。...C++纯虚函数 定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。...由多态方式调用的时候动态绑定。 4、实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。

    53251

    浅析C++中的RTTI:运行时类型识别

    使用方法 在C++中,我们通常使用两种主要的 RTTI 操作符:typeid 和 dynamic_cast。 typeid操作符 typeid 操作符用于获取一个对象/类型的类型信息。...它返回一个 std::type_info 类型的对象,该对象包含有关表达式的类型信息。其中可读性强的是name方法获取类型名称。...(基类向子类转换)。.../引用向子类指针/引用转换、支持子类指针/引用向子类指针/引用的转换,不支持指向基类的基类指针/引用向子类指针/引用的转换。...在使用dynamic_cast操作符时,务必进行适当的错误检查,以确保向下转型的安全性。 总结 运行时类型信息(RTTI)是C++语言中的一个强大特性,它允许我们在运行时获取对象的类型信息。

    11410

    JS 继承的多种方法

    存在的问题:通过原型链实现继承时,原型实际上会变成另一个类型实例,而原先的实例属性也会变成原型属性,如果该属性为引用类型时,所有的实例都会共享该属性,一个实例修改了该属性,其它实例也会发生变化,同时,在创建子类型时...使用这个方法,我们还可以在子类型构造函数中向超类型构造函数传递参数。...,同时可以在子类型构造函数中向超类型构造函数传递参数。...缺点:定义方法时,将会在每个实例上都会重新定义,不能实现函数的复用。 3....缺点:无论什么情况下,都会调用两次超类型构造函数,一次是在创建子类型的时候,另一次是在子类型构造函数内部,子类型最终会包含超类型对象的全部实例属性,但是需要在调用子类型构造函数时重写这些属性。 4.

    2.8K10

    字节一面,轻松通过!

    每个元素在内存中都保留了对前一个和后一个元素的引用,因此在添加或删除元素时,不需要像ArrayList那样移动元素,只需改变引用即可。...虚函数和多态性 虚函数: 在基类中声明的虚函数可以被子类重写(覆盖)并在运行时动态绑定到相应的函数。使用 virtual 关键字声明函数为虚函数。...每个包含虚函数的类都有一个对应的虚函数表,表中存储了虚函数的地址。在运行时,编译器根据对象的实际类型查找虚函数表,并调用相应的函数。...派生类必须实现(覆盖)抽象类中的纯虚函数,否则它们也会成为抽象类。 4. 有了解C++的shared_ptr 吗?...当共享同一个资源时,确保在不再需要时及时释放智能指针。 std::shared_ptr 是 C++ 中常用的智能指针之一,可以帮助管理动态分配的资源,避免内存泄漏,并提高代码的安全性和可维护性。

    18110

    Java面向对象基础(封装继承多态)【1】

    继承使用要点 1.父类也称作超类、基类、派生类等。 2.Java中只有单继承(当然Java的接口可以多继承,类只有单继承),没有像C++那样的多继承。...在打印输出或者用字符串连接对象时,会自动调用该对象的toString()方法。...如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals (y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象...super关键字 super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。 使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。...继承树追溯 ·属性/方法查找顺序:(比如:查找变量h) 1. 查找当前类中有没有属性h 2. 依次上溯每个父类,查看每个父类中是否有h,直到Object 3. 如果没找到,则出现编译错误。

    68640
    领券