C++基础知识
文章平均质量分 52
C++语法知识
肥嘟嘟的左卫门
这个作者很懒,什么都没留下…
展开
-
类模板,函数模板,及其特化
一 使用模板的意义当我们进行int型数据交换时调用swap函数:void swap(int &a , int &b){ *a ^= *b; *b ^= *a; *a ^= *b;}但该函数面对double,char,long等其他类型时,不适用。解决办法:重载void swap(double &a , double &b){ *a ^= *b; *b ^= *a; *a ^= *b;}void swap(char &a , char原创 2022-04-14 22:25:55 · 1155 阅读 · 0 评论 -
vector的几种初始化及赋值方式
C++的初始化方法很多,各种初始化方法有一些不同。(1): vector ilist1;默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。(2): vector ilist2(ilist);vector ilist2 = ilist;两种方式等价 ,ilist2 初始化为ilist 的拷贝,ilist必须与ilist2 类型相同,也就是同为int的vect转载 2022-02-17 22:08:04 · 4878 阅读 · 0 评论 -
const成员变量初始化的位置
const变量必须在定义的时候初始化,因此类的const成员变量必须在初始化列表中进行初始化。原创 2021-12-29 17:25:31 · 392 阅读 · 0 评论 -
static修饰成员变量的初始化位置
static修饰的成员变量先于对象存在,故static修饰的成员变量必须在类外初始化。原创 2021-12-29 17:10:20 · 626 阅读 · 0 评论 -
智能指针指向的基类是否需要虚析构函数
C++子类的智能指针赋值给父类的智能指针,析构函数不是虚函数,也能正确执行析构。class BaseNode {public: BaseNode(); virtual ~BaseNode();};class BinaryTreeNode : public BaseNode {public: virtual ~BinaryTreeNode();};int main() { cout << "使用裸指针" << endl; BaseNode *p转载 2021-12-14 20:53:22 · 508 阅读 · 0 评论 -
C++虚析构函数的作用
虚析构函数的作用总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的。我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:有下面的两个类:#include<iostream>using namespace std;class ClxBase{ public:转载 2021-12-14 20:45:34 · 272 阅读 · 0 评论 -
C++11 constexpr和const的区别详解
在大部分实际场景中,const 和 constexpr 是可以混用的,但在某些场景中,必须明确使用。 凡是表达“常变量”语义的场景都使用 const,表达“常量”语义的场景都使用 constexpr。#include <iostream>#include <array>using namespace std;constexpr int sqr1(int arg){ return arg*arg;}const int sqr2(int arg){ retur原创 2021-12-13 11:36:20 · 1174 阅读 · 0 评论 -
C++11 使用using定义类型别名
传统的定义类型别名的方法是使用关键字typedef:typedef double NOUBLE;我们也可以使用#define来定义别名(使用预处理器)#define NOUBLE double在C++11中使用关键字using来进行别名声明假设我们现在定义了结构体MyString,那么我们可以使用using为MyString类型设置一个别名:using MS = MyString;这样我们在定义该结构体类型变量时,就可以使用MS作为类型名了MS TempString;...原创 2021-12-13 11:18:34 · 1267 阅读 · 0 评论 -
多态的实现原理
1. 概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例:其中:B的虚函数表中存放着B::foo和B::bar两个函数指针。D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz。提示:为了描述方便,本文在探讨对象内存布局时,将忽略内存对齐对布局的影响。2. 虚函数表构造过程从编译器的角度来说,B的虚函数转载 2021-12-06 15:49:38 · 145 阅读 · 0 评论 -
C++类型转换之dynamic_cast的应用场景和注意事项
应用场景:多态中基类指针或应用转换为子类的指针或引用。必要条件,缺一不可:1,必须是多态的场景,即基类中有虚函数。(若没有虚函数,则编译不过)2,基类指针或引用确实指向了子类的对象。(若基类不确实指向子类,则转换失败,dynamic_cast返回nullptr)#include <iostream>using namespace std;class Shape{public: Shape(int x,int y) :_x(x),_y(y){}原创 2021-12-06 14:27:20 · 1017 阅读 · 0 评论 -
避免在派生类中重新定义基类的非虚函数
我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态。这么说来,在派生类中重定义(override)虚函数是没有任何问题的。那么,可以重定义基类中的非虚函数吗?答案是:技术上你可以这样做(至少编译器不会报错),但是绝大多数情况下不应该做。class Base{public: void f() { cout << "Base::f()" << endl; }};class Derived转载 2021-12-06 11:01:36 · 815 阅读 · 0 评论 -
C++如何避免内存泄露
最好的方法:1,禁止使用new/delete2,使用智能指针Smart Ptr原创 2021-12-02 19:34:57 · 407 阅读 · 0 评论 -
C++:引用的简单理解
前言:引用是C++一个很重要的特性,最近看了很多有关引用的资料和博客,故在此对引用的相关知识进行总结一、什么是引用引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价语法:类型 &引用名=目标变量名;特别注意:1.&不是求地址运算符,而是起标志作用2.引用的类型必须和其所绑定的变量的类型相同1 #include<iostream>2 using namespace std;3 int main(){4转载 2021-07-19 20:56:39 · 631 阅读 · 0 评论 -
const_cast
一. 函数描述:const_cast < type-id > ( expression )主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。去掉const属性:const_case<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。加上const属性:const int* k = const_case<const int*>(j),一般很少用,因为可以把一个非con转载 2021-05-27 20:43:27 · 373 阅读 · 0 评论 -
static_cast和dynamic_cast的区别
3.1static_cast用法:static_cast< type-id > ( exdivssion )该运算符把exdivssion转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。②用于基本数据类型之间的转换,如把int转换成cha...转载 2021-05-27 20:31:03 · 413 阅读 · 0 评论 -
JSON for Modern C++
JSON(JavaScript Object Notation)是一种非常理想的轻量级数据交换格式,基于以下两种结构:名-值对的集合- 在各种语言中,被实现为对象、记录、结构、字典、散列表、键列表、关联数组等; 值的有序列表- 在大多数语言中,被实现为数组、向量、列表、序列等。JSON for Modern C++的设计目标就是:直观的语法- 使用现代 C++ 操作符魔力,使 JSON 成为第一类数据类型 微型的集成- 仅有json.hpp,无依赖、无复杂构建系统,符合C++...转载 2021-05-11 18:07:30 · 1950 阅读 · 0 评论 -
unique_ptr智能指针详解
在一个大型程序中,指向动态分配内存的指针可能会在程序的各个部分使用。在这种情况下,确定哪些内存不再需要,或者程序的哪个部分应该负责删除指针就变得比较困难。程序可能会因此出现悬挂指针,也就是说,指针已经被删除了,但其内存仍然在使用中;还可能出现内存泄漏,也就是说,即使已经不再需要内存了,但指针仍然未被删除。另外还有双重删除的问题,当程序的某 部分要删除一个已经被删除的指针时,即可出现这种情况。如果被删除的内存已经进行了重新分配,则双重删除会对程序造成破坏。C++11 引入了智能指针的概念来解决该问题。智能.转载 2021-04-25 11:37:19 · 629 阅读 · 0 评论 -
share_ptr智能指针使用详解
share_ptr 智能指针,也被称为共享指针,用于管理可以由多个智能指针共同拥有的动态分配对象。特别是,类型 shared_ptr<T> 用于管理 T 类型对象的所有权。类构造函数 shared_ptr<T>(T * ptr) 可用于创建共享指针,管理由裸指针 ptr 给定地址的对象。shared_ptr 类可以重载指针运算符*和->。以下示例创建了一个由共享指针管理的动态分配整数,然后即可通过该指针访问它:int main() { shared_ptr<...转载 2021-04-25 10:49:01 · 5254 阅读 · 1 评论 -
STL算法概述
STL 算法介绍算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。 <algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较、 交换、查找、遍历操作、复制、修改、反转、排序、合并等等。 <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加 法和乘法在序列上的一些操作。 ...转载 2021-03-10 17:12:53 · 187 阅读 · 0 评论