4、reinterpret_cast 几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用; 5、为什么不使用C的强制转换?...它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。...,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。...如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。...所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。
用于类层次结构中基类和派生类之间指针或引用的转换 // 上行转换(派生类---->基类)是安全的 CDerived *tCDerived1 = nullptr; CBase *tCBase1 = static_cast...将基类对象指针类型转换为派生类对象指针 CBase i_CBase; // 创建基类对象 CBase &r_CBase = i_CBase; // 基类对象的引用 CDerived &r_CDerived...= dynamic_cast(r_CBase); // 将基类对象的引用转换派生类对象的引用 3.const_cast(常量转换) 常量指针(或引用)与非常量指针(或引用)之间的转换...将常量指针转换为非常量指针,然后可以修改常量指针指向变量的值 int *pi = const_cast(cpi); *pi = 200; // 2....将常量引用转换为非常量引用 int &r_value1 = const_cast(c_value1); // 4.
static_cast主要有如下几种用法: 用于类层次结构中基类和派生类之间指针或引用的转换。 进行向上转换是安全的; 进行向下转换时,由于没有动态类型检查,所以是不安全的。...因为 基类不包含派生类的成员变量,无法对派生类的成员变量赋值。 用于基本数据类型之间的转换,如int、float、char之间的互相转换 把空指针转换成目标类型的空指针。...4.reinterpret_cast 几乎什么都可以转,比如将 int 转指针,执行的是逐个比特复制的操作。容易出问题,尽量少用。...类析构顺序 派生类本身的析构函数 对象成员析构函数 基类析构函数 因为析构函数没有参数,所以包含成员对象的类的析构函数形式上并无特殊之处。...析构函数与虚函数 析构函数必须是虚函数,因为将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们 new 一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏
左值引用&右值引用左值引用:常规引用,可支持取地址运算符&获取内存地址;右值引用:右值是临时对象、字面量等表达式,右值引用解决临时对象或函数返回值给左值对象时的深度拷贝;std::move:将输入的左值或右值转换为右值引用类型的临终值...智能指针分为:shared_ptr/unique_ptr/weak_ptr三种;shared_ptr:多个智能指针共享一个对象,支持拷贝和赋值,每次拷贝或赋值后对象的引用计数加1,智能指针销毁一次,引用计数减...unique_ptr:不支持拷贝和赋值,任何时刻只能有一个unique_ptr指向特定的对象;weak_ptr:为解决shared_ptr对象相互引用导致对象无法释放,衍生出weak_ptr,只使用内置指针...类设计的工具拷贝、赋值、销毁拷贝构造函数:将一个对象作为非引用实参、将一个非引用对象直接作为函数返回值、用花括号列表初始化一个数组或者一个类成员时均使用了拷贝构造函数。...当一个基类指针指向一个派生类对象时,虚函数表指针指向派生类对象的虚函数表。当调用虚函数时,由于派生类对象重写了派生类对应的虚函数表项,基类在调用时会调用派生类的虚函数,从而产生多态。
1. override 关键字 override 关键字用于显式地标记派生类中的成员函数,以指明该函数是对基类中的虚函数的重写。...它帮助提高代码的可读性和可维护性,并且可以帮助编译器检查是否正确地重写了基类的虚函数。...}; 在派生类中使用 override 关键字,如果没有正确地重写基类中的虚函数,编译器会产生错误。...这样可以避免一些常见的错误,如函数签名不匹配等。 2. final 关键字 final 关键字用于修饰类和虚函数,表示禁止派生类继续派生或者禁止派生类重写该虚函数。...通常用于解决 std::shared_ptr 循环引用的问题。当需要使用资源时,需要先将 std::weak_ptr 转换为 std::shared_ptr。
实际异常的抛出和捕获在类型匹配时有特殊的情况,例如可以用基类类型捕获派生类类型对象,这个在实际中应用的非常广泛。 2.2 在函数调用链中异常栈展开匹配原则 1....,然后用基类对象就可以调用派生类里面重写的what虚函数了。...不能被继承 在C++98中,可以私有化基类的构造函数,此时派生类无法调到基类的构造函数完成成员变量的初始化,则该基类便无法被继承。...,也可以将指针类型转换为整数类型,比如将void*类型指针转换为一个实际类型的指针,或者将一个派生类指针转换为基类指针。...例如下面代码中,可以将基类类型的ptr转为派生类类型的dptr,如果ptr指向的是父类则会存在越界访问的风险,如果ptr指向的是子类则没什么问题,只不过把指针的访问范围挪动几个字节即可。
简述shared_ptr shared_ptr 实现共享式拥有概念,多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。...它是对对象的一种弱引用,不会增加对象的引用计数,和 shared_ptr 之间可以相互转化,shared_ptr 可以直接赋值给它,它可以通过调用 lock 函数来获得shared_ptr。...使用特点:从底层对数据进行重新解释,依赖具体的平台,可移植性差;可以将整形转 换为指针,也可以把指针转换为数组;可以在指针和引用之间进行肆无忌惮的转换。...),仅执行基类的析构,派生类的自身内容将无法被析构,造成内存泄漏。...如果基类的析构函数定义成虚函数,那么编译器就可以根据实际对象,执行派生类的析构函数,再执行基类的析构函数,成功释放内存。
一个派生类构造函数的执行顺序如下 虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数) 基类的构造函数(多个普通基类也按照继承的顺序执行构造函数) 类类型的成员对象的构造函数(按照初始化顺序...) 派生类自己的构造函数 必须使用成员列表初始化的四种情况 当初始化一个引用成员时 当初始化一个常量成员时 当调用一个基类的构造函数,而它拥有一组参数时 当调用一个成员类的构造函数,而它拥有一组参数时...假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...派生类指针转换为基类指针,指针值会不会变 将一个派生类的指针转换成某一个基类指针,编译器会将指针的值偏移到该基类在对象内存中的起始位置 C 语言的编译链接过程 源代码-->预处理-->编译-->...如果引用计数变为 0,shared_ptr 的析构函数就会销毁对象,并释放它占用的内存。 unique_ptr 一个 unique_ptr 拥有它所指向的对象。
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* 之类的转换,但其本身并不安全) 也允许将任何整数类型转换为任何指针类型以及反向转换
上述代码,此时还不能完成基类向子类的转换!例如:unique_ptr转unique_ptr。...unique_ptr处实现了子类向基类的转换,但是却没有实现基类向子类的转换,例如::unique_ptr转unique_ptr。..._1); // 子类转基类 上行转换,安全!...(3)上行转换,子类转基类,例如:智能指针转换类似于circle*转换为shape*,此时引用技术为两者共享。等价于static_cast。...(sptr3_1); // 子类转基类 上行转换,安全!
由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。 虚函数只能借助于指针或者引用来达到多态的效果。...(2)抽象类的作用:抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。...(3)使用抽象类时注意: 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。...如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。 抽象类是不能定义对象的。...但是unique_ptr要比scoped_ptr有更多的功能:可以像原始指针一样进行比较,也可以像shared_ptr定制删除器,也可以安全地放入标准容器。
nullPtr是表示空指针的字面值常量。 void*:可以指向任意非常量的指针类型,不能执行解引用操作。...派生类对象: 一个派生类对象包含多个部分:自己定义的成员的子对象,以及基类的子对象。 派生到基类的类型转换: 由于派生类对象中含有与其基类对象的组成部分,因此可以进行隐式的执行派生类到基类的转换。...派生类构造函数: 每个类控制自己的成员的初始化过程。派生类首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。 派生类使用基类的成员: 派生类可以访问基类的公有成员和受保护成员。...class NoDerived final {}; // NoDerived不能作为基类 (3)类型转换与继承 我们可以将基类的指针或引用绑定到派生类对象上。...术语 覆盖:override,派生类中定义的虚函数如果与基类中定义的同名虚函数与相同的形参列表,则派生类版本将覆盖基类的版本。 多态:程序能够通引用或指针的动态类型获取类型特定行为的能力。
程序使用动态内存,往往出于以下三种原因之一: 程序不知道自己需要使用多少对象,比如说容器类。 程序不知道所需对象的准确类型,可以 new一个基类指针用来指向派生类对象。...可以用 reset来将一个新的指针赋予一个 shared_ptr。...unique_ptr p1(new int(42)); // release将 p1置为空,将所有权从 p1转移给 p2 unique_ptr p2(p1.release()); unique_ptr...将一个 weak_ptr绑定到一个 shared_ptr,不会改变 shared_ptr的引用计数。...可以使用 new T[]或类型别名的形式分配一个动态对象数组,默认情况下,该数组是未初始化的。方括号中的大小必须是整数,但不必是常量。
假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...假设基类中采用的是非虚析构函数,当删除基类指针指向的派生类对象时就不会触发动态绑定,因而只会调用基类的析构函数,而不会调用派生类的析构函数。...它主要有如下几种用法: 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用引用的转换 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的 进行下行转换(把基类指针或引用转换成派生类表示)...如果下行转换是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。...108、如果想将某个类用作基类,为什么该类必须定义而非声明? 派生类中包含并且可以使用它从基类继承而来的成员,为了使用这些成员,派生类必须知道他们是什么。 结语 好家伙,终于完了。
因此,操作系统和编译器可以通过内存分配的位置来知道来区分全局变量和局部变量。 7. shared_ptr, weak_ptr, unique_ptr分别是什么?...unique_ptr 实现独占式拥有或严格拥有的智能指针,通过禁用拷贝构造和赋值的方式保证同一时间内只有一个智能指针可以指向该对象;shared_ptr增加了引用计数,每次有新的shared_ptr指向同一个资源时计数会增加...而子类析构函数具有析构掉基类的职责,所以不会造成内存泄漏。而基类并不知道自己的子类。 4. 构造函数和析构函数能抛出异常吗? 不能。 5. 多继承存在什么问题?如何消除多继承中的二义性?...在继承时,基类之间或基类与派生类之间发生成员同名时,将出现对成员访问的不确定性,即同名二义性。...2) type_info类里面的比较运算符 3) dynamic_cast运算符,该运算符将基类的指针或引用安全地转换为派生类类型的指针或引用。 9.
使用方式首先include头文件 #include 1.3 类型 1.3.1 shared_ptr 它是一种拥有引用计数的智能指针类型,当引用计数减为0时,真实内存自动被释放...\n"; } 2.1.4类型转换 使用c++11提供的 static_pointer_cast、const_pointer_case和dynamic_pointer_cast进行基类->派生类的类型转换...它可以接受shared_ptr或者另一个weak_ptr的赋值。...2.3 unique_ptr unique_ptr像是shared_ptr的对立面,因为unique_ptr只运行自身的计数是1或者0,但是因为无需维护引用计数增减,所以他的内部可以设计地更简单,开销更小...unique_ptr意味着如果需要进行对象的转移,可以使用move语义进行。
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 ) {...右值是无法获取地址吗?如果可以 和左值有什么区别【作业】 总结 个人理解:智能指针重点 不是引用计数,引用计数需要额外空间存储。 应该背后值语义,就是如何拷贝一个对象。
类的改进 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。
领取专属 10元无门槛券
手把手带您无忧上云