C++
文章平均质量分 92
通过书籍《C++ Primer plus》和网站视频学习和实践总结得出。
孟小胖_H
本人博客大部分都是在复习中整理的,主要用于记录笔记,其中也记录了一些个人观点和思考,欢迎指点,一起共同学习进步。
展开
-
C++——异步操作(std::future、std::async、std::packaged_task、std::promise)
文章目录一、std::future与std::async1.基本概念2.代码演示二、std::future与std::packaged_task1.基本知识2.代码演示三、std::future与std::promise1.基本知识2.代码演示一、std::future与std::async1.基本概念(1)std::future的基本知识std::future期待一个返回,从一个异步调用的角度来说,future更像是执行函数的返回值,C++标准库使用std::future为一次性事件建模,如果.原创 2022-01-19 00:27:58 · 3808 阅读 · 0 评论 -
C++——互斥量
文章目录一、基本知识二、独占互斥量mutex1.mutex的介绍2.mutex的成员函数3.实例演示三、lock_guard和unique_lock的使用和区别四、递归互斥量recursive_mutex1.基本知识2.演示示例五、带超时的互斥量std::timed_mutex和std::recursive_timed_mutex一、基本知识C++11提供如下4种语义的互斥量(mutex)std::mutex,独占的互斥量,不能递归使用。std::time_mutex,带超时的独占互斥量,不能递.原创 2021-12-24 17:44:18 · 2419 阅读 · 0 评论 -
C++——右值引用
文章目录一、基本知识1.作用2.右值的基本概念以及与左值的辨别3.右值引用的特性二、右值引用优化性能三、移动语义(move)和完美转发(forward)1.移动语义move2.完美转发forward一、基本知识1.作用作用:C++11中引用了右值引用和移动语义,可以避免无谓的复制,提高了程序性能。2.右值的基本概念以及与左值的辨别①C++11中的所有的值必将属于左值、将亡值、纯右值三者之一,将亡值和纯右值都属于右值。②左值是表达式结束后仍然存在的持久对象,右值是指表达式结束时就不存在的临时对.原创 2021-12-24 02:42:41 · 2677 阅读 · 2 评论 -
C++——可变模板参数
声明:由于对可变模板参数了解资源有限,以下有些观点仅为个人参考手册实践得出的,不要被我个人的观点误导。文章目录一.基本语法知识1.基本知识2.基本语法二.基本使用方法1.基本演示2.参数展开一.基本语法知识1.基本知识C++11的新特性–可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。2.基本语法template <class... T>void f(T... args);原创 2021-12-20 17:51:04 · 1497 阅读 · 0 评论 -
C++四种类型强制转换——const_cast、static_cast、dynamic_cast、reinterpret_cast
文章目录一、const_cast1.基本知识2.示例演示二、static_cast1.基本知识2.示例演示三、dynamic_cast1.基本知识2.示例演示四、reinterpret_cast1.基本知识2.示例演示一、const_cast1.基本知识(1)const_cast只针对指针、引用,当然,this指针也是其中之一。(2)const_cast的大部分使用主要是将常量指针转换为常指针。常量指针指向的空间的内容不允许被修改,但是使用const_cast进行强制转换就可以修改。(3)co.原创 2021-12-14 18:07:07 · 14602 阅读 · 2 评论 -
C++智能指针的使用和仿写(auto_ptr、unique_ptr、shared_ptr、weak_ptr)(详解)
智能指针的使用和仿写本博客主要记录以下内容:1.auto_ptr(包括使用讲解和仿写)2.unique_ptr(包括使用讲解和仿写)3.shared_ptr(包括使用讲解和仿写)4.weak_ptr(包括使用讲解和仿写)原创 2021-10-26 12:48:57 · 435 阅读 · 0 评论 -
动态联编和静态联编
一、动态联编和静态联编的基本概念1.基本概念将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在C语言中这个步骤更简单,因为C语言的函数名不允许重复,即没有函数重载这一说,每个函数名都对应着一个函数代码块。但是在C++中要复杂,因为C++中允许函数重载,必须得根据函数名和形参列表来对应一个函数代码块。C/C++编译器在编译过程就完成了这种联编。在编译过程中进行联编被称为静态联编 (早期联编)。但是虚函数的产生使得静态联编变的困难,因为父类的虚函数允许被子类重写。当我们用一个父类指针指向一原创 2021-10-23 12:30:31 · 4693 阅读 · 0 评论 -
C++多态
本篇博客主要记载以下内容:(1)多态的基本概念(计算器代码示例)(2)纯虚函数和抽象类(制作饮品示例)(3)虚析构函数和纯虚析构函数(电脑组装示例)对于虚函数指针和虚函数表(以及虚指针虚表)在另一篇博客中详细记录。一、多态的基本概念1.多态的基本概念多态分为两类:静态多态和动态多态。静态多态: 函数重载和运算符重载都属于静态多态。动态多态: 派生类和虚函数实现运行时多态。静态多态区别:静态多态的函数地址早绑定,编译阶段确定函数地址。动态多态的函数地址晚绑定,运行阶段确定函数地址。多态动原创 2021-10-23 08:50:20 · 5713 阅读 · 3 评论 -
父类指针指向子类对象的问题、父类对象和子类对象之间的问题
一、父类指针指向子类对象先上代码:class Base {public: void base_fun1() {} virtual void base_fun2() { cout << "this is Base fun2()" << endl; }public: int a_a;protected: int a_b;private: int a_c;};class Son :public Base {public: void son_fu原创 2021-10-22 20:49:38 · 10751 阅读 · 1 评论 -
C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表
本博客主要通过查看类的内容的变化,深入探讨有关虚指针和虚表的问题。一、虚继承产生的虚基类表指针和虚基类表如下代码:写一个棱形继承,父类Base,子类Son1和Son2虚继承Base,又来一个类Grandson继承Son1和Son2。代码:class Base{public: int a;protected: int b;private: int c;};class Son1 :virtual public Base {public: int a;protected: i原创 2021-10-20 01:39:59 · 7105 阅读 · 26 评论 -
列表初始化和赋值初始化的使用注意事项
成员变量初始化方式有两种:列表初始化和赋值初始化。如下代码。但是这两种初始化表面上看着相同,但是用法和原理却并不相同。本篇博客主要讨论这两种初始化的使用方法和基本原理。class Test{public: Test(int a, int b, int c):_a(a)//初始化列表初始化 { _b = b;//赋值初始化 _c = c;//赋值初始化 }private: int _a; int _b; int _c;};首先,必须是本类的本身的成员变量或者是基类才允许用列表原创 2021-10-20 18:19:58 · 1287 阅读 · 0 评论 -
C++类的继承
继承是很大程度上解决了代码重复的问题。比如狗和猫都属于动物,我们需要在猫和狗的类里面写上动物年龄,动物名字等。但是动物都可以有年龄和起名称,这个时候我们写个动物类,把动物都有的属性写进去,狗和猫继承动物类就好了,就不需要对狗和猫的类里面分别写年龄和名字了。本篇博客主要记录以下问题:一、基本语法和继承方式二、继承中的对象模型三、继承中对象的构造析构顺序四、继承同名成员的处理方式(包括普通成员、静态成员)五、多继承语法六、棱形继承一、基本语法和继承方式1.基本语法继承的基本格式为:clas原创 2021-10-18 17:07:20 · 3643 阅读 · 1 评论 -
运算符重载(加减运算符、前置加加(减减)后置加加(减减)运算符、赋值运算符、输入输出运算符、关系运算符、函数调用)
编译器对于一个类会默认生成以几种函数:1.默认构造函数(空形参,空函数体)2.默认拷贝构造函数(浅拷贝,也叫值拷贝、字节拷贝)3.析构函数(空形参,空函数体。析构函数要求形参列表必须是空的,所以析构函数不能重载)4.赋值函数(两个对象赋值,也是以浅(值、字节)拷贝的形式)讲述以上这四种默认生成的函数的优秀博客点击此处。编译器会对内置类型(比如char,int,short…)进行加减乘除运算符计算,但是我们自定义类型,有些运算编译器不知道怎么做。我们自定义类型需要进行这些运算的时候,需要我们重载运原创 2021-10-18 01:27:52 · 5964 阅读 · 0 评论 -
友元的创建和使用(普通函数做友元,成员函数做友元,类做友元)
友元的作用:允许让友元类(友元函数)访问自己的私有属性友元的创建方式:在类的声明(函数的声明)前面加上友元关键字friend,放在允许被访问私有属性的类的里面(不受访问权限限制,随便放,只不过一般我们放在类的最上面)。一、全局函数做类的友元函数class Building{ friend void visit1(Building building);//visit1函数在类里面被声明为友元类 friend void visit2(Building& building);//visit2函原创 2021-10-17 13:31:20 · 3317 阅读 · 4 评论 -
类的成员函数与内联以及静态成员
一、类的成员函数与内联在类内定义的所有函数都自动称为内联函数。如果在类内声明,在类外定义,也可以定义为内联函数。在定义函数时添加inline限定符。。(1)此外,内联函数一定要和函数定义在一起,否则只是声明的时候加上内联,是不会成为内联函数的声明:inline void fun();函数体:void fun(){}这样只有声明带内联,函数定义时没有带内敛,所以fun不是内联函数。(2)inline一定要和函数定义在一起。声明:void fun();定义:inline void fun(){}原创 2021-10-15 10:40:25 · 2264 阅读 · 0 评论 -
类的构造函数(分类和调用)
一、构造函数的分类及调用1.构造函数的分类(1)类的构造函数按照形参分类,可以分为无参构造函数和有参构造函数。(2)按照类型分类,可以分为普通构造函数和拷贝构造函数。普通拷贝构造函数可以根据形参的不同进行构造函数重载。但是析构函数不行,析构函数要求不能有形参,所以析构函数不能重载,而且必须没有形参。拷贝构造函数又分为浅拷贝和深拷贝。这两点在下面第四大点单独整理。2.调用不同的构造函数对应的写法写个学生类。注意,一下构造函数的成员变量初始化方式为初始化列表。格式为:构造函数(形参列表):属性1(原创 2021-10-15 01:52:38 · 6328 阅读 · 0 评论 -
struct和class之间问题(+引发的个人思考,和对共用体思考)
一、C语言中的struct在C语言中,struct是一种自定义数据类型,所以在C语言中,struct不能包含任何函数,否则编译器会报错。因为C语言是面向过程的编程。采用过程性编程首先考虑要遵循的步骤,然后考虑如何表示这些数据。也就是先考虑过程后考虑数据,这样方法和数据就分开了。而在C语言中结构体就是为了考虑数据的封装而存在的。还有就是在C语言中不能存在空结构体,否则编译器会报错。原因很简单,C语言中结构体就是为了封装数据类型,统一为一个新的struct数据类型,既然是封装数据而存在,那么定义一个结构体不原创 2021-10-14 21:46:50 · 584 阅读 · 0 评论 -
类的使用注意事项
整篇以这个学生类为例。class Student {public: Student() {}//默认构造函数形式 ~Student() {}//默认析构函数形式 string GetName() { return name; } int GetAge() { return age; } float GetScore();private: string name; int age; float score;};float Student::GetScore()//原创 2021-10-14 14:35:08 · 373 阅读 · 0 评论 -
类和对象的基本概念
在C++中,用户定义类型指的就是实现抽象接口的类设计。在谈类之前,我们先谈谈接口。一、接口1.什么是接口要使用一个类,必须了解其公共接口。要编写一个类,必须创建其公共接口。在书上说接口是一个共享框架。其实接口可以简单的认为就是一个供用户使用的方法。举例子简单点可以认为,一个.cpp文件实现了一个功能(这个功能可能还可以分成多个小功能,在文件内被实现,所以文件内可能有多个函数相互调用配合)。然后头文件只声明一个或着其中几个函数,我们调用这些函数就可以完全使用这些功能。那么这几个函数就是接口,供我们调原创 2021-10-14 02:01:29 · 251 阅读 · 0 评论 -
C++11新增的关键字decltype(auto)
一、函数模板存在的类型问题template<class T1,class T2>void fun(T1 a, T2 b){ (T1 or T2?)y = a + b;}语句y = a+b,其实我们并不知道y应该为什么类型,我们可以写成T1或者T2甚至可能是其类型。但是具体准确的写成哪一个呢?我们并不确定,因为用函数模板产生函数实体跟传入实参的类型有关,如果我们调用的时候是fun(int, double)那么按道理来说,结果应该是double,当然,如果我们用T1(在这里即int)也原创 2021-10-14 00:37:09 · 470 阅读 · 0 评论 -
C++函数模板
一、基本概念和基本使用基本概念:函数模板是通用的函数描述。使用泛型来定义函数,泛型可以用具体的类型替换,通过将类型作为参数传递给函数模板,可以使编译器生成形参为该类型的函数。基本使用:下面举两个简单的例子。template<class T>void MySwap(T& a, T& b){ T tmp = a; a = b; b = tmp;}int main(){ int i_a = 10; int i_b = 20; MySwap(i_a, i原创 2021-10-13 18:39:09 · 477 阅读 · 0 评论 -
C++函数重载
一.基本概念函数重载即函数名相同,函数形参列表不同(函数特征标不同)的一类函数称为函数重载。注意函数重载的依据只有形参列表不同。函数的返回类型不同不可以作为函数重载的依据。如果两个函数的参数数目和类型相同,那么这两个函数的函数特征标就相同,不能重载。如下举例一组重载函数:void fun(int a);void fun(int a,int b);void fun(double a,int b);void fun(double a,double b);void fun(const char*原创 2021-10-13 09:18:39 · 7622 阅读 · 0 评论 -
函数默认形参与占位参数
一.默认参数1.默认参数的基本概念默认参数就是我们可以给函数的形参设定一个初始值。我们调用函数的时候,如果我们传了实参,那么就用我们传的实参,如果我们没有传实参的话,就用函数形参的初始值。int fun1(int a = 10){ cout << "this is fun1:a = " << a << endl; return 0;}int main(){ fun1();//如果函数的形参没有默认值,这句代码是通不过的 fun1(20);原创 2021-10-12 23:35:20 · 444 阅读 · 0 评论 -
数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用
一、数组指针和指针数组1.数组指针(行指针)首先要知道数组指针是指向数组的指针。所以数组指针本质是个指针,只不过指向一个数组而已。格式为:T (*ptr)[]。注意:"[]" 优先级高于 " * " ,本质得是指针,所以" * "得优先与ptr在一起,所以必须用()。在继续讲述数组指针知识之前先来讲讲普通一维数组和普通指针。(1)一维数组和普通指针下面讲述数组指针将拿int (*ptr)[]举例。int(*ptr)[10];这个语句是定义一个指针,这个指针指向一个int类型的整形数组,注意原创 2021-10-15 20:31:20 · 368 阅读 · 1 评论 -
引用&——左值引用int&、右值引用int&&、常量引用const int&、左值和右值
1.引用的基本使用引用是对变量起别名。用代码来说明:int main(){ int a = 0; int& b = a; b = 10; cout << a << endl; cout << b << endl; return 0;}这段代码中是对引用的基本使用。定义变量a = 10;在栈中分配一个4字节空间,空间里的值赋值为10。int& b = a;相当于给a这个空间取个别名,这个时候b和a就是指同一个空间,相原创 2021-10-12 00:09:27 · 5465 阅读 · 1 评论