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

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

4、reinterpret_cast 几乎什么都可以,比如int指针,可能会出问题,尽量少用; 5、为什么不使用C的强制转换?...它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。...,指针可以指向派生类的对象,如果删除该的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用的析构函数,这样整个派生类的对象完全被释放。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除指针时,只会调用的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...所以析构函数声明为虚函数是十分必要的。在实现多态时,当用操作派生类,在析构时防止只析构而不析构派生类的状况发生,要将的析构函数声明为虚函数。

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

C++基础知识

static_cast主要有如下几种用法: 用于层次结构中派生类之间指针或引用的转换。 进行向上转换是安全的; 进行向下转换时,由于没有动态类型检查,所以是不安全的。...因为 不包含派生类的成员变量,无法对派生类的成员变量赋值。 用于基本数据类型之间的转换,如int、float、char之间的互相转换 把空指针转换成目标类型的空指针。...4.reinterpret_cast 几乎什么都可以,比如 int 指针,执行的是逐个比特复制的操作。容易出问题,尽量少用。...析构顺序 派生类本身的析构函数 对象成员析构函数 析构函数 因为析构函数没有参数,所以包含成员对象的的析构函数形式上并无特殊之处。...析构函数与虚函数 析构函数必须是虚函数,因为将可能会被继承的父的析构函数设置为虚函数,可以保证当我们 new 一个子类,然后使用指针指向该子类对象,释放指针时可以释放掉子类的空间,防止内存泄漏

1.4K32

C++关键知识点梳理

左值引用&右值引用左值引用:常规引用,可支持取地址运算符&获取内存地址;右值引用:右值是临时对象、字面量等表达式,右值引用解决临时对象或函数返回值给左值对象时的深度拷贝;std::move:输入的左值或右值转换为右值引用类型的临终值...智能指针分为:shared_ptr/unique_ptr/weak_ptr三种;shared_ptr:多个智能指针共享一个对象,支持拷贝和赋值,每次拷贝或赋值后对象的引用计数加1,智能指针销毁一次,引用计数减...unique_ptr:不支持拷贝和赋值,任何时刻只能有一个unique_ptr指向特定的对象;weak_ptr:为解决shared_ptr对象相互引用导致对象无法释放,衍生出weak_ptr,只使用内置指针...设计的工具拷贝、赋值、销毁拷贝构造函数:一个对象作为非引用实参、一个非引用对象直接作为函数返回值、用花括号列表初始化一个数组或者一个成员时均使用了拷贝构造函数。...当一个指针指向一个派生类对象时,虚函数表指针指向派生类对象的虚函数表。当调用虚函数时,由于派生类对象重写了派生类对应的虚函数表项,在调用时会调用派生类的虚函数,从而产生多态。

91830

每个C++开发者都应该学习和使用的C++11特性

1. override 关键字 override 关键字用于显式地标记派生类中的成员函数,以指明该函数是对中的虚函数的重写。...它帮助提高代码的可读性和可维护性,并且可以帮助编译器检查是否正确地重写了的虚函数。...}; 在派生类中使用 override 关键字,如果没有正确地重写中的虚函数,编译器会产生错误。...这样可以避免一些常见的错误,如函数签名不匹配等。 2. final 关键字 final 关键字用于修饰和虚函数,表示禁止派生类继续派生或者禁止派生类重写该虚函数。...通常用于解决 std::shared_ptr 循环引用的问题。当需要使用资源时,需要先将 std::weak_ptr 转换为 std::shared_ptr

4910

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

实际异常的抛出和捕获在类型匹配时有特殊的情况,例如可以类型捕获派生类类型对象,这个在实际中应用的非常广泛。 2.2 在函数调用链中异常栈展开匹配原则 1....,然后用对象就可以调用派生类里面重写的what虚函数了。...不能被继承 在C++98中,可以私有化的构造函数,此时派生类无法调到的构造函数完成成员变量的初始化,则该便无法被继承。...,也可以指针类型转换为整数类型,比如void*类型指针转换为一个实际类型的指针,或者一个派生类指针转换为指针。...例如下面代码中,可以类型的ptr转为派生类类型的dptr,如果ptr指向的是父则会存在越界访问的风险,如果ptr指向的是子类则没什么问题,只不过把指针的访问范围挪动几个字节即可。

29040

硬核 | C++ 基础大全

简述shared_ptr shared_ptr 实现共享式拥有概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。...它是对对象的一种弱引用,不会增加对象的引用计数,和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给它,它可以通过调用 lock 函数来获得shared_ptr。...使用特点:从底层对数据进行重新解释,依赖具体的平台,可移植性差;可以整形 换为指针,也可以把指针转换为数组;可以在指针和引用之间进行肆无忌惮的转换。...),仅执行的析构,派生类的自身内容无法被析构,造成内存泄漏。...如果的析构函数定义成虚函数,那么编译器就可以根据实际对象,执行派生类的析构函数,再执行的析构函数,成功释放内存。

1.1K10

C++知识概要

一个派生类构造函数的执行顺序如下 虚拟的构造函数(多个虚拟则按照继承的顺序执行构造函数) 的构造函数(多个普通也按照继承的顺序执行构造函数) 类型的成员对象的构造函数(按照初始化顺序...) 派生类自己的构造函数 必须使用成员列表初始化的四种情况 当初始化一个引用成员时 当初始化一个常量成员时 当调用一个的构造函数,而它拥有一组参数时 当调用一个成员的构造函数,而它拥有一组参数时...假设中采用的是非虚析构函数,当删除指针指向的派生类对象时就不会触发动态绑定,因而只会调用的析构函数,而不会调用派生类的析构函数。...派生类指针转换为指针,指针值会不会变 一个派生类的指针转换成某一个指针,编译器会将指针的值偏移到该在对象内存中的起始位置 C 语言的编译链接过程 源代码-->预处理-->编译-->...如果引用计数变为 0,shared_ptr 的析构函数就会销毁对象,并释放它占用的内存。 unique_ptr 一个 unique_ptr 拥有它所指向的对象。

1.1K20

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

const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量引用...public 成员:可以被任意实体访问 protected 成员:只允许被子类及本类的成员函数访问 private 成员:只允许被本类的成员函数、友元或友元函数访问 继承 (父)——> 派生类(...; shape2 = nullptr; return 0; } 虚析构函数 虚析构函数是为了解决的指针指向派生类对象,并用的指针删除派生类对象。...如下: shared_ptr unique_ptr weak_ptr auto_ptr(被 C++11 弃用) Class shared_ptr 实现共享式拥有(shared ownership)概念。...允许任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,但其本身并不安全) 也允许任何整数类型转换为任何指针类型以及反向转换

3.6K50

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

由于编写代码的时候并不能确定被调用的是的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或者引用来达到多态的效果。...(2)抽象的作用:抽象的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类具体实现在其中作为接口的操作。...(3)使用抽象时注意: 抽象只能作为来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承的纯虚函数,则这个派生类仍然还是一个抽象。...如果派生类中给出了纯虚函数的实现,则该派生类就不再是抽象了,它是一个可以建立对象的具体的。 抽象是不能定义对象的。...但是unique_ptr要比scoped_ptr有更多的功能:可以像原始指针一样进行比较,也可以shared_ptr定制删除器,也可以安全地放入标准容器。

29151

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

const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量引用...public 成员:可以被任意实体访问 protected 成员:只允许被子类及本类的成员函数访问 private 成员:只允许被本类的成员函数、友元或友元函数访问 继承 (父)——> 派生类(...; shape2 = nullptr; return 0; } 虚析构函数 虚析构函数是为了解决的指针指向派生类对象,并用的指针删除派生类对象。...如下: shared_ptr unique_ptr weak_ptr auto_ptr(被 C++11 弃用) Class shared_ptr 实现共享式拥有(shared ownership)概念。...允许任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,但其本身并不安全) 也允许任何整数类型转换为任何指针类型以及反向转换

4.9K41

两万字总结《C++ Primer》要点

nullPtr是表示空指针的字面值常量。 void*:可以指向任意非常量的指针类型,不能执行解引用操作。...派生类对象: 一个派生类对象包含多个部分:自己定义的成员的子对象,以及的子对象。 派生到的类型转换: 由于派生类对象中含有与其对象的组成部分,因此可以进行隐式的执行派生类的转换。...派生类构造函数: 每个控制自己的成员的初始化过程。派生类首先初始化的部分,然后按照声明的顺序依次初始化派生类的成员。 派生类使用的成员: 派生类可以访问的公有成员和受保护成员。...class NoDerived final {}; // NoDerived不能作为 (3)类型转换与继承 我们可以的指针或引用绑定到派生类对象上。...术语 覆盖:override,派生类中定义的虚函数如果与中定义的同名虚函数与相同的形参列表,则派生类版本覆盖的版本。 多态:程序能够通引用或指针的动态类型获取类型特定行为的能力。

1.5K30

两万字总结《C++ Primer》要点

nullPtr是表示空指针的字面值常量。 void*:可以指向任意非常量的指针类型,不能执行解引用操作。...派生类对象: 一个派生类对象包含多个部分:自己定义的成员的子对象,以及的子对象。 派生到的类型转换: 由于派生类对象中含有与其对象的组成部分,因此可以进行隐式的执行派生类的转换。...派生类构造函数: 每个控制自己的成员的初始化过程。派生类首先初始化的部分,然后按照声明的顺序依次初始化派生类的成员。 派生类使用的成员: 派生类可以访问的公有成员和受保护成员。...class NoDerived final {}; // NoDerived不能作为 (3)类型转换与继承 我们可以的指针或引用绑定到派生类对象上。...术语 覆盖:override,派生类中定义的虚函数如果与中定义的同名虚函数与相同的形参列表,则派生类版本覆盖的版本。 多态:程序能够通引用或指针的动态类型获取类型特定行为的能力。

1.6K20

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

假设中采用的是非虚析构函数,当删除指针指向的派生类对象时就不会触发动态绑定,因而只会调用的析构函数,而不会调用派生类的析构函数。...假设中采用的是非虚析构函数,当删除指针指向的派生类对象时就不会触发动态绑定,因而只会调用的析构函数,而不会调用派生类的析构函数。...它主要有如下几种用法: 用于层次结构中(父)和派生类(子类)之间指针或引用引用的转换 进行上行转换(把派生类的指针或引用转换成表示)是安全的 进行下行转换(把指针或引用转换成派生类表示)...如果下行转换是安全的(也就说,如果指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。...108、如果想将某个用作,为什么该类必须定义而非声明? 派生类中包含并且可以使用它从继承而来的成员,为了使用这些成员,派生类必须知道他们是什么。 结语 好家伙,终于完了。

2.2K40

C++面试题

因此,操作系统和编译器可以通过内存分配的位置来知道来区分全局变量和局部变量。 7. shared_ptr, weak_ptr, unique_ptr分别是什么?...unique_ptr 实现独占式拥有或严格拥有的智能指针,通过禁用拷贝构造和赋值的方式保证同一时间内只有一个智能指针可以指向该对象;shared_ptr增加了引用计数,每次有新的shared_ptr指向同一个资源时计数会增加...而子类析构函数具有析构掉的职责,所以不会造成内存泄漏。而并不知道自己的子类。 4. 构造函数和析构函数能抛出异常? 不能。 5. 多继承存在什么问题?如何消除多继承中的二义性?...在继承时,之间或派生类之间发生成员同名时,将出现对成员访问的不确定性,即同名二义性。...2) type_info里面的比较运算符 3) dynamic_cast运算符,该运算符的指针或引用安全地转换为派生类类型的指针或引用。 9.

1.7K42

智能指针究竟在考什么|Effective Modern C++

There are four smart pointers in C++11: std::auto_ptr, std::unique_ptr, std::shared_ptr, and std::weak_ptr...但是可以转移所有权。 不允许默认的拷贝与赋值 。 但是可以转移所有权。...remove_reference::type&&; return static_cast(t); } dynamic_cast运算符的主要用途: 的指针或引用安全地转换成派生类的指针或引用..., (1) 必须是的指针或者引用 ,int类型不行 (3) base必须有虚函数 int main() { for( int n = 0; n < 10; ++n ) {...右值是无法获取地址?如果可以 和左值有什么区别【作业】 总结 个人理解:智能指针重点 不是引用计数,引用计数需要额外空间存储。 应该背后值语义,就是如何拷贝一个对象。

56230

C++11新特性学习笔记

的改进 4.1 继承构造(vs2013 不支持) C++ 11允许派生类继承的构造函数(默认构造函数、复制构造函数、移动构造函数除外)。...,不能初始化派生类的成员变量 l 如果的构造函数被声明为私有,或者派生类是从中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数 4.2 委托构造 和继承构造函数类似...l final阻止的进一步派生和虚函数的进一步重写 l override确保在派生类中声明的函数跟的虚函数有相同的签名 class B1 final {}; // 此类不能被继承 //class...标准库提供了函数 std::move,这个函数以非常简单的方式左值引用换为右值引用。...要修改传递进来的a的拷贝,可以添加mutable修饰符。 n &a。a按引用进行传递。 n a, &b。a按值进行传递,b按引用进行传递。 n =,&a, &b。

2.2K20
领券