随笔分类 - 编程语言及数据结构 / C++
摘要:小结:智能指针是C++中自动内存管理的主要手段智能指针在各种平台上都有不同的表现形式智能指针能够尽可能的避开内存相关的问题STL和Qt中都提供了对智能指针的支持
阅读全文
摘要:Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计数为0时才删除指向的对象 析构函数没有被调用,意味着pt这个智能指针对象,它在生命周期结束时并没有同
阅读全文
摘要:智能指针类模板智能指针本质上就是一个对象,它可以像原生指针那样来使用。 智能指针的意义-现代C++开发库中最重要的类模板之一-C++中自动内存管理的主要手段-能够在很大程度上避开内存相关的问题 1.内存泄露,在测试阶段很难发现。造成的原因就是申请堆空间中的内存,忘记释放。 2.多次指针释放:一个指针
阅读全文
摘要:优化之前的IntArray类 小结:模板参数可以是数值型参数数值型模板参数必须在编译期间唯一确定数组类模板是基于数值型模板参数实现的数组类模板是简易的线性表数据结构
阅读全文
摘要:预备知识模板参数可以是数值型参数(非类型参数)template<typename T, int N>void func(){ T a[N]; //使用模板参数定义局部数组}func<double, 10>(); 数值型模板参数的限制-变量不能作为模板参数(变量是不能在编译期就唯一确定的)-浮点数不能
阅读全文
摘要:多参数类模板类模板可以定义任意多个不同的类型参数template <typename T1, typename T2>class Test{public: void add(T1 a, T2 b);}; 使用上述的类模板: Test<int ,float> t; 类模板可以被特化:即特殊化-指定类模
阅读全文
摘要:类模板的概念和意义类模板一些类主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关如:数组类,链表类,stack类,Queue类等C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能 C++中的类模板-以相同的方式处理不同的类型-在类声明前使
阅读全文
摘要:函数模板深入理解-编译器从函数模板通过具体类型产生不同的函数-编译器会对函数模板进行两次编译 对模板代码本身进行编译 对参数替换后的代码进行编译 注意事项:-函数模板本身不允许隐式类型转换 自动推导类型时,必须严格匹配 显示类型指定时,能够进行隐式类型转换 编程实验函数模板本质分析 多参数函数模板函
阅读全文
摘要:发散性问题 C++中有几种交换变量的方法? 定义宏代码块 VS 定义函数 编程实验 利用定义宏代码块的方法看上去很完美,但是宏是预处理器处理的程序单元,后续出场的编译器根本不知道宏的存在,因此不推荐用宏来完成类似函数的功能。因为不安全。 直接定义函数 定义宏代码块-优点:代码复用,适合所有的类型-缺
阅读全文
摘要:dynamic_cast是与继承相关的类型转换关键字dynamic_cast要求相关的类中必须有虚函数用于直接或者间接继承关系的指针(引用)之间-指针: 转换成功:得到目标类型的指针 转换失败:得到一个空指针 -引用: 转换成功:得到目标类型的引用 转换失败:得到一个异常操作信息 编译器会检查dyn
阅读全文
摘要:构造函数是否可以成为虚函数?构造函数不能成为虚函数-C++中的多态是由指向虚函数表的指针来完成的,那么指向虚函数表的指针是由编译器创建的,同时也是由编译器进行初始化。那什么时候对虚函数表指针进行初始化呢?-在构造函数执行结束后,虚函数表指针才会正确的初始化 析构函数是否可以成为虚函数?-建议在设计类
阅读全文
摘要:new和malloc的区别是什么?-new关键字是C++的一部分,在所有的C++编译器中都被支持-malloc是由C库提供的函数,在某些系统开发中是不能调用的-new以具体类型为单位进行内存分配-malloc以字节为单文进行内存分配-new在申请内存空间时可以进行初始化,它会触发构造函数的调用-ma
阅读全文
摘要:工程开发中的多重继承方式:(这是面向对象理论中所推荐的方式)单继承某个类 + 实现(多个)接口 在父类中添加一个成员函数,用于解决在多继承的情况下指向同一个对象的多个指针它们的值不一样。定义接口class Interface1、class Interface2这样的方式是工程中常用的一种解决方案。但
阅读全文
摘要:多重继承的问题三:多重继承可能产生多个虚函数表 sizeof(d) = 8 相关的三个类中都没有定义成员变量,那这8个字节是从哪来的,谁占用的?虚函数表指针 在Derived这个类中有两个成员,这两个成员都是虚函数表指针。在创建对象的时候,这两个成员会指向不同的虚函数表 需要进行强制类型转换时,C+
阅读全文
摘要:问题:C++中是否允许一个类继承自多个父类呢?答案是肯定的,这种现象就是多重继承多重继承是C++中一个特有的特性,因为在其他的程序设计语言里面,如C#、java等语言只支持单重继承 C++支持编写多重继承的代码-一个子类可以拥有多个父类-子类拥有所有父类的成员变量-子类继承所有父类的成员函数-子类对
阅读全文
摘要:什么是抽象类面向对象中的抽象概念在进行面向对象分析时,会发现一些抽象的概念图形的面积如何计算? 在现实中需要知道具体的图形类型才能求面积,所以对概念上的图形求面积是没有意义的 Shape只是一个概念上的类型,没有具体的对象。 面向对象中的抽象类-可用于表示现实世界中的抽象概念-是一种只能定义类型,而
阅读全文
摘要:多态的本质分析 用C写面向对象,用C实现多态 继承的本质就是父子间成员变量的叠加C++中的多态是通过虚函数表实现的虚函数表是由编译器自动生成与维护的虚函数的调用效率低于普通成员函数
阅读全文
摘要:在C++编译器内部类可以理解为结构体子类是由父类成员叠加子类新成员得到的class Derived : public Demo{ int mk;} C++多态的实现原理-当类中声明虚函数时,编译器会在类中生成一个虚函数表-虚函数表是一个存储成员函数地址的数据结构-虚函数表是由编译器自动生成与维护的-
阅读全文
摘要:类中的成员函数位于代码段中调用成员函数时对象地址作为参数隐式传递成员函数通过对象地址访问成员变量C++语法规则隐藏了对象地址的传递过程 d.getI()d对象的地址被传到了getI这个函数的内部,但是传递过程在C++代码中是看不到的。深度挖掘的就是编译器背后的故事,此时就需要用到C语言了,用C语言实
阅读全文
摘要:C++对象模型,其实就是C++中的对象在内存中是如何排布的。C++中的对象包含了成员变量和成员函数,其实就是研究C++中的类对象它的成员变量和成员函数在内存中是如何排布的。 回归本质class 是一种特殊的struct(之所以特殊,是因为它们的默认访问级别不一样)-在内存中class依旧可以看作变量
阅读全文