c++高级话题
文章平均质量分 91
呋喃吖
编程使我快乐
展开
-
C++11右值引用的价值体现
好久之前就写了一篇文章:谈谈C++中的左值,右值,右值引用,std::move()的问题是理解移动构造和移动赋值的前提基础;这里简单总结一下:左值引用不能直接引用右值;左值引用要引用右值,需要加const修饰左值引用;右值也不可以直接引用左值;右值要引用左值需要加std::move()函数修饰左值;首先明确一点:右值引用的产生就是为了弥补左值引用的不足!所以先回顾一下,左值引用的价值体现在哪,它的不足又体现在哪;左值引用的第一个价值体现常见就是:左值引用的问题就在于做函数的返回值,它只能解决变量原创 2022-06-29 20:05:08 · 538 阅读 · 1 评论 -
深入剖析C++实现多态的原理
文章目录前言有虚函数的类对象模型派生类继承有虚函数的基类的对象模型无虚函数派生类继承有虚函数基类的对象模型有虚函数派生类继承有虚函数的基类对象模型多态原理剖析汇编代码分析多态的过程有关多态的常见几个问题前言要理解C++的多态,必须先学会使用多态:多态的基本使用,我总结一篇文章:有需要可以看看【传送门】:谈谈C++多态的基本使用和总结有虚函数的类对象模型class Base {public: Base(){ cout << "Base::Base()的构造函数调用" <原创 2022-04-13 10:16:35 · 1597 阅读 · 2 评论 -
谈谈C++多态的基本使用和总结
前言文章目录前言多态构成多态的条件虚函数虚函数的重写(覆盖):多态调用虚函数的规则析构函数的重写(基类与派生类析构函数的名字不同)多态简单的说:多态就是根据你传入的不同的对象,去做同一样的事情,会有不同的结果和行为的表现产生;在C++中,传入不同的对象意思:给父类传入不同的子类;去做同一样的事意思是:父类指针或者引用调用了同一样的虚函数;产生不同的结果意思是:调用同样的虚函数,但是结果却不一样;构成多态的条件继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数;2.原创 2022-04-11 11:07:35 · 2074 阅读 · 2 评论 -
从内存的角度窥探C++多继承中的菱形继承问题
文章目录1. 什么是菱形继承2. 菱形继承会带来什么问题3. 虚继承的方式解决菱形继承数据冗余和二义性的问题4. 通过内存窥探菱形继承的对象模型1. 什么是菱形继承菱形继承就是继承的方式长得像个菱形而已,它是多继承中一种比较特殊的存在;比如下面的类关系之间的设计:student 和 worker 类 继承了 person 类,而 undergraduate 继承了 student 和 worker 这两个类;这个继承的图很像菱形,咋们说它是菱形继承;2. 菱形继承会带来什么问题菱形继承会带来原创 2022-04-08 23:51:02 · 578 阅读 · 0 评论 -
简要谈谈C++继承中派生类的 构造 拷贝 赋值 析构的调用问题
文章目录继承体系派生类的特殊函数调用规则演示验证派生类调用父类的构造和赋值运算符总结:继承体系派生类的特殊函数调用规则C++中有如下规则:基类有默认构造函数,派生类假如不显示调用基类的默认构造函数,那么派生类的构造函数会自动调用基类的默认构造函数;假如基类没有默认构造函数,那么派生类必须显示的去调用基类的其他构造函数;派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。假如派生类不调用基类的拷贝构造就会报错派生类的operator=必须要调用基类的operator=完成基原创 2022-04-07 16:25:31 · 1305 阅读 · 1 评论 -
谈谈C++中非类型模板参数 模板的特化(全特化,偏特化)
1. 非类型模板参数模板参数分类类型形参****与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。比如在C++11的array使用了非类型模板参数:注意:1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的;2. 非类型的模板参数必须在编译期就能确认结果;2.非类型模板参数应用场景有时候,我们希望有一个静态的数组,或者存放数据原创 2022-04-01 16:57:25 · 1482 阅读 · 2 评论 -
C++11中Lambda表达式的基本用法和总结
前言对于Lambda表达式:其实本质就是一个函数,其用法也和函数差不多,只不过它和函数的区别在于,lambda表达式可以在函数里面定义,而函数不可以嵌套定义,并且在形式上也有一定的区别;一般我们把lambba表达式,当作一种匿名函数去使用,也就是说:这个函数是没有名称的;lambda的基本形式基本形式如下:[捕获列表](参数列表)->返回类型{函数体};int main(){ []{ cout<<"这是最基本的lambda表达式的形式"; }; return 0;原创 2022-02-16 10:59:18 · 2817 阅读 · 1 评论 -
对C++中的智能指针的理解和基本用法总结
智能指针的概述毫无疑问,智能指针相比于普通的裸指针(也就是我们直接用 new出来的对象的指针)更加智能,最明确的体现在于,可以自动帮你管理内存泄漏的问题,也就是说是,使用智能指针,不需要你手动去delete一个指针;简单的说:只能指针就是对普通的裸指针进行了一层包装,包装之后,就使得这个指针更加智能,能够自动在合适时间帮你去释放内存;C++标准库提供了四种智能指针的使用:std::auto_ptr; c++98就有的一种智能指针,但是现在被遗弃,完全被std::unique_ptr所取代;下面三原创 2022-02-08 12:55:18 · 2924 阅读 · 1 评论 -
谈谈C++ 中深浅拷贝的问题
文章目录构造函数的潜在问题风险解决构造函数的潜在风险方案浅拷贝深拷贝构造函数的潜在问题风险对于成员变量是有指针类型的类来说,构造函数初始化成员时候,很容易就会出大问题;举个例子:class Car{public: Car(int price,const char* name):m_price(price),m_name(name) { }private: int m_price; char* m_name; //Car类有指针类型的成员变量};int main(){ cha原创 2022-01-25 12:11:15 · 1274 阅读 · 0 评论 -
对C++中的静态类型,动态类型,静态绑定,动态绑定的理解
前言:要想真的理解C++中的虚函数调用过程,首先自然而然的要了解虚函数调用过程的表面现象,那么要了解它的表面现象就自然而然的不能不理解静态类型和动态类型,静态绑定和动态绑定的概念!其次才能更加深层次的探讨虚函数的调用原理,虚表!!!自出现继承后,就可以有基类指针或者引用指向派生类对象了,此时指针或者引用的类型就不在是简简单单的了!!因为这些概念设计到对函数的调用,到底是如何调用的基类的还是派生类的,如何调用函数也牵扯到虚函数如何调用的过程!理解清楚就很方便理解多态了,多态的最主要的原理还是虚函数表原创 2021-11-25 20:19:37 · 1757 阅读 · 10 评论 -
谈谈C++中的左值,右值,右值引用,std::move()的问题
前言在C++中,我们一直都听说过一种左值右值的概念,甚至有左值引用,右值引用,左值表达式,右值表达式等的东西;一般大家都对他们模棱两可,甚至有人听过std::move()的用法,但是不知其真正的含义。本文也就是帮助大家扫扫盲,顺便给自己的c++知识库做一个总结。左值和右值我们知道,变量的本质是内存中的一段存储空间;而左值就是使用表达式的存储空间,表示这个表达是就是使用存储空间,即使用的是内存,表示的是内存一段空间。从字面上理解左值:就是能赋值在等号 = 左边的值,就叫左值(使用的是内存空间);而右原创 2021-09-13 11:14:00 · 526 阅读 · 4 评论 -
深入探讨C++中临时对象的常见产生情况及其解决的方案
前言在C++中很容易就写出一些代码,这些代码的特点就是偷偷的给你产生了一些临时对象,导致临时对象会调用拷贝构造函数,赋值运算符,析构函数,假如该对象还有继承的话,也会调用父类的拷贝构造函数,赋值运算赋函数等。这些临时对象所调用的函数,都是不必要的开销,也就是说,我本意不想你给我调用这些函数的,但你编译器却给我偷偷的调用了,就是由于我程序员写代码产生临时对象而产生的。...原创 2021-09-08 20:37:16 · 3277 阅读 · 15 评论 -
再谈C++中的构造函数,深入理解构造函数(下篇)
前言继续上篇文章再谈C++中的构造函数,深入理解构造函数(上篇),来聊C++中的构造函数再谈对构造函数初始化列表的理解(2)构造函数的初始化列表不仅仅是比在构造函数体内的赋值语句初始化看得高级:其实有些情况1. 必须使用构造函数初始化列表初始化;2. 而且构造函数初始化列表初始化对于非内置类型的成员变量初始化能达到少调用几次该非内置类型成员变量的一些特殊函数的作用,简而言之,就提升了执行效率。构造函数初始化列表是如何提升效率的我们先聊聊第二点:也就是构造函数初始化列表是如何提升效率的。首先,原创 2021-09-02 18:30:37 · 253 阅读 · 1 评论 -
再谈C++中的构造函数,深入理解构造函数(上篇)
前言其实两个月前我写过一篇C++基础文章:关于构造函数的基本用法,文章链接传送门????:c++基础 面向对象:第五篇(构造,析构,拷贝函数),但是,这里仅仅是基础中的用法,并没有涉及太多的讲解,打算今天整理以下,我对构造函数的再度理解,分享给大家。文章目录前言构造函数的作用,存在意义,目的隐式转化和explicit构造函数的作用,存在意义,目的构造函数的作用,存在意义,目的:用来初始化类对象的成员变量的函数如何理解呢?其实就是为了封装性(我的理解),当我们定义一个类对象时候,其实可以在类外直接原创 2021-08-31 23:13:55 · 1123 阅读 · 15 评论