2、源码: # encoding: utf-8 # author: walker # date: 2014-05-15 # summary: 更改图片尺寸大小 import os from PIL import... filein: 输入图片 fileout: 输出图片 width: 输出图片宽度 height:输出图片高度 type:输出图片类型
前言 上篇文章主要讲述了CSS样式更改中的多列、元素是否可见、图片透明度基础知识,这篇文章我们来介绍下CSS样式更改中用户界面和指针类型基础用法。...在宽度和高度之外绘制元素的内边距和边框。 border-box 为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。...3).对轮廓进行偏移outline-offset div { outline-offset:15px 轮廓与边框边缘的距离 } 2.指针类型Cursor div{ cursor:auto }...指示程序正忙(通常是一只表或沙漏) help 指示可用的帮助(通常是一个问号或一个气球) 参考文档:W3C官方文档(CSS篇) 二、总结 这篇文章主要介绍了CSS样式更改篇中的用户界面和指针类型基础知识...,希望让大家对CSS样式更改有个简单的认识和了解。
Use std::unique_ptr for exclusive-ownership resource management 默认情况下(不传入自定义析构器时), std::unique_ptr 和原始指针大小一样...,因为多个使用者可能并发读写该引用计数 构造 std::shared_ptr 在移动构造情况下,不会对引用计数进行修改 std::shared_ptr 的自定义析构器和 std::unique_ptr...自定义的析构器区别 对于 std::unique_ptr ,自定义析构器属于 std::unique_ptr 的一部分 对于 std::shared_ptr ,自定义析构器不属于 std::unique_ptr...std::shared_ptr ,那么就不必做上面那么多工作了 std::unique_ptr 中,自定义析构器是指针对象的一部分,要求在编译生成的特定函数中(析构函数,移动函数)指针指向的类型必须是完整的...std::shared_ptr 中,自定义析构器不是指针对象的一部分,也就不要求在编译生成的特定函数(析构函数,移动函数)对象中指针指向的类型是完整的 7.Summary std::unique_ptr
--- 智能指针简单实现 这里为了图省事只实现了构造函数、析构函数和基本的运算符,仅供参考。...虽然我这里专门根据数组类型进行unique_ptr特化,但是只是写出来方便理解,并不建议使用,实际使用时管理独占动态数组还是推荐容器std::vector。...考虑一种情况:如果一个函数同时出现了unique_ptr和unique_ptr的重载,并且尝试通过隐式转换调用,那么编译器无法推测应该转换为哪种类型。...--- 浅总结一下智能指针知识点 shared_ptr一般比unique_ptr更占用内存,但是如果在unique_ptr使用自定义析构器的话,那么情况可能不同。...如下场景不适合或谨慎使用make工厂函数: 自定义析构器。工厂函数无法自定义析构器,所以这种场景就无法使用。
正因为 std::auto_ptr 的设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 库中智能指针的设计思想,引入了三种类型的智能指针,即:std::unique_ptr、std:...std::unique_ptr 不仅可以持有一个堆对象,也可以持有一组堆对象,示例如下: int main() { //创建10个int类型的堆对象 //形式1 std::unique_ptr...假设现在有一个 Socket 类,对应着操作系统的套接字句柄,在回收时需要关闭该对象,我们可以如下自定义智能指针对象的资源析构函数,这里以 std::unique_ptr 为例: class Socket..., deletor); return 0; } 自定义 std::unique_ptr 的资源释放函数其规则是: std::unique_ptr...其中 T 是你要释放的对象类型,DeletorPtr 是一个自定义函数指针。
智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr :独占资源所有权的指针。 std::shared_ptr :共享资源所有权的指针。...() == 1); // sptr1 已经释放 } // use_count 为 0 时自动释放内存 和 unique_ptr 一样,shared_ptr 也可以指向数组和自定义 deleter。...一个 shared_ptr 对象的内存开销要比裸指针和无自定义 deleter 的 unique_ptr 对象略大。...fclose(fp); }); std::cout std::endl; // 输出 16 无自定义 deleter 的 unique_ptr...::bad_weak_ptr' what(): bad_weak_ptr 小结 智能指针,本质上是对资源所有权和生命周期管理的抽象: 当资源是被独占时,使用 std::unique_ptr 对资源进行管理
up on normal exit } 问题综述: func1中,忘记释放资源导致资源泄露; func2中,在释放资源如果发生异常导致资源泄露; func2中,使用异常捕获的方法会随着资源数量和异常类型的增加导致代码变得复杂...定义删除器的方法是必须将删除器的类型指定为第二个模板参数 删除器类型可以是函数、函数指针或函数对象 unique_ptr uq(new int[666],...delete[] p; }; unique_ptr> uq(new int[666], T); 销毁其它类型资源时,需要指定函数或lambda表达式,必须将删除程序的类型声明为...sp.owner_before(wp) 通过弱指针提供严格的弱排序 unique_ptr up 默认构造函数;使用默认/传递的删除器类型的实例作为删除器,创建一个空的唯一指针 unique_ptr...up(nullptr) 使用默认/传递的删除器类型的实例作为删除器,创建一个空的唯一指针 unique_ptr up(ptr) 使用默认/传递的删除器类型的实例作为删除器,创建拥有* ptr的唯一指针
,和pInv关联起来 std::unique_ptr pInv(nullptr,delInvmt);//调用自定义的析构 /...operator->() 重载 -> 号,当智能指针指向的数据类型为自定义的结构体时,通过 -> 运算符可以获取其内部的指定成员。...swap(x) 交换当前 unique_ptr 指针和同类型的 x 指针。...::hash // //map使用 std::less可以使用自定义类型,里面没有WidgetID的比较函数 // static std::mapstd::weak_ptr...//1, make系列函数不允许使用自定义析构器 //1, make系列函数不允许使用自定义析构器 //但是 std::unique 和 std::shared_ptr却可以 //自定义析构器 auto
减少预处理器的工作 这是“隔离频繁更改的头文件”和“不要包含不需要的头文件”的一般形式。类似BOOST_PP这样的工具可能非常有用,但也给预处理器带来了巨大的负担。...建议只将经常使用但很少更改的头文件定义为预编译头文件(例如系统头文件和库头文件),以减少编译时间。但必须记住,使用预编译头文件有几个缺点: 预编译头文件不可移植。 生成的PCH文件依赖于机器。...另外,类似于shared_ptr和make_shared的关系,应该使用make_unique(C++14或更高版本)来创建unique_ptr: std::make_unique类型,但需要先测试 根据情况和编译器的优化能力,一种可能比另一种更快。...此外,编译器有可能只对整数类型进行优化,而不一定对所有迭代器或其他用户自定义类型进行优化。 总而言之,如果前置自增操作符与后置自增操作符在语义上相同,那么使用前置自增操作符总是更好。
前言 前面我们学习了一种自定义类型,结构体,现在我们学习另外两种自定义类型,联合 和 枚举。 正文开始—— 一、联合体 1....c 共用一块内存空间,所以联合体也叫共用体,同一时间只能使用 i 和 c 中的一个。...相同成员的结构体和联合体对比 我们再对比一下相同成员的结构体和联合体的内存布局情况。...每种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。...增加代码的可读性和可维护性; 和 #define 定义的标识符比较枚举有类型检查,更加严谨; 便于调试,预处理阶段会删除 #define 定义的符号; 使用方便,一次可以定义多个常量; 枚举常量遵循作用域规则
联合体 1.1 联合体类型的声明 像结构体一样,联合体也是由一个或多个成员构成,这些成员可以是不同类型。 但是编译器只为最大的成员分配足够的内存空间。联合体特点是所有成员共用同一块内存空间。...#include //联合类型的声明 union UN { char ch; int i; }; int main() { //联合变量定义...1.3 相同成员的结构体和联合体对比 1.4 联合体大小的计算 -> 联合体的大小至少是最大成员的大小。 ->当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。...枚举类型的优点 我们也可以使用#define定义常量,为什么还有枚举? 枚举的优点: 1. 增加代码的可读性和可维护性。 2....和#define定义的标识符比较枚举有类型检查,更加严谨。 3. 便于调试,预处理阶段会删除 #define 定义的符号。 4. 使用方便,一次可以定义多个变量。 5.
一、联合体 1.1 联合体类型的声明 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同的类型。 声明方式如下图: 那联合体和结构体究竟有什么区别呢??...1.4 相同成员的结构体和联合体的对比 我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。 这说明使用联合体是可以节省空间的!!!...每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。...2.2 枚举类型的优点 1、增加代码的可读性和可维护性 比如我们在实现游戏时常常会这样去写 此时如果不和菜单建立联系 我们并不能一下子就看出来case1和case0的含义,可读性较差,可如果在这边使用枚举类型...2、 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
前言 : 书接上文, 下面我将继续详解C语言的剩下两个自定义类型: 联合体和枚举 个人主页 : 酷酷学!!! 正文开始 1....1.3 相同成员的结构体和联合体对比 //结构体 struct S { char c; int i; }; struct S s = {0}; //联合体 union Un { char c;...每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。...枚举类型 2.1 枚举类型的声明 枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。...枚举的优点: 增加代码的可读性和可维护性 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
Un un = { 0 }; // printf("%zd\n", sizeof(union Un)); // printf("%p\n", &un);//007EFDD4 把un里面的c和i.../ printf("%p\n", &(un.i));//007EFDD4 // return 0; //} /* 取出的地址都是相同的 第一个字节是c,所有的4个字节都是i 所以我们发现i和c...//都是常量,被称为枚举常量 MALE=2, FEMALE=4,//我们这里是给常量一个初始值,到后面就无法进行更改了 SECRET=8 }; int main()...SECRET);//2 /* 打印出来的值是0 1 2 因为枚举常量的值默认是从0开始的,一次递增往下走,涨1 */ //如果我们希望这个值是我们期望的,我们可以在枚举类型中进行更改...枚举的优点: 增加代码的可读性和可维护性 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
其实我们仔细分析就可以画出联合体变量un的内存布局图: 1.3 相同成员的结构体和联合体对比 我们再对比一下相同成员的结构体和联合体的内存布局情况。...每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。...,都没有标签,是因为每次使用结构体struct gift_list的时候这里面的结构体和联合体都只会用一次,而且也不会用这里的结构体和联合体去创建其它变量。...{}中的内容是枚举类型的可能取值,也叫枚举常量 。 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。...枚举的优点: 增加代码的可读性和可维护性 和#define定义的标识符比较枚举有类型检查,更加严谨。
1、联合体(union) 1.1 什么是联合体 联合体是一种特殊的数据类型,它类似于结构体,联合体也是由一个或者多个成员构成这些成员可以是不同的类型。...在U中,字符类型的ch占1个字节,整型类型的 i 占4个字节,所以编译器只会为整型i分配4个内存的空间。 到这里我们大致清楚联合体的这个特点有什么作用。但是联合体究竟是怎么共用同一块空间的呢?...U { char ch; int i; }; int main() { union U u; u.i = 0x11223344; u.ch = 0; return 0; } 这里给 i 和...enum Sex { //枚举类型的可能取值 men,//常量 women, secret }; 上面enum是枚举关键字,Sex是枚举类型的名称,大括号中的便是枚举的成员,也都是常量,它们也被称为枚举常量...枚举的优点: 增加代码的可读性和可维护性 和#define定义的标识符相比枚举有类型检查,更加严谨 使用方便,一次可以定义多个常量 枚举常量遵循作用域规则的,枚举声明在函数内,只能在函数内使用
正因为 std::auto_ptr 的设计存在如此重大缺陷,C++11 标准在充分借鉴和吸收了 boost 库中智能指针的设计思想,引入了三种类型的智能指针,即 std::unique_ptr、std:...//创建10个int类型的堆对象 //形式1 std::unique_ptr sp1(new int[10]); //形式2 std::unique_ptr...假设现在有一个 Socket 类,对应着操作系统的套接字句柄,在回收时需要关闭该对象,我们可以如下自定义智能指针对象的资源析构函数,这里以 std::unique_ptr 为例: #include <iostream...deletor); return 0; } 自定义 std::unique_ptr 的资源释放函数其规则是: std::unique_ptr 其中...T 是你要释放的对象类型,DeletorPtr 是一个自定义函数指针。
在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...--Microsoft Docs 为了支持对 RAII 原则的简单采用,C++ 标准库提供了三种智能指针类型: std::unique_ptr std::shared_ptr std::weak_ptr...==================================== unique_ptr unique_ptr 类型智能指针在设计上最显著的特点是内部托管的指针一旦被创建就不能被任何形式的复制给另一个...unique_ptr 没有拷贝构造函数,因此不能用于赋值。该指针最常用的情况是单例模式和编译防火墙的封装。...allocate_shared 如果需要为对象指定自定义分配器,请使用。 make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。
C++的智能指针是一种特殊的指针类型,它能够自动管理内存资源,避免常见的内存泄漏和多次释放等问题。C++11引入了三种主要的智能指针:unique_ptr、shared_ptr和weak_ptr。...支持移动语义:unique_ptr支持移动构造和移动赋值操作,可以将所有权转移给新的unique_ptr,而无需进行内存拷贝。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外的清理操作。...不再拥有对象的所有权 std::cout std::endl; // 输出: 42 // 使用自定义删除器 struct Deleter {...unique_ptr超出作用域时会自动释放内存,同时调用自定义删除器 return 0; } 常见成员函数 operator*:解引用操作符,用于获取 unique_ptr 所指向对象的引用。
删除器的基本概念 在C++中,智能指针(Smart Pointers)如std::unique_ptr和std::shared_ptr默认使用delete或delete[]来释放内存。...1.1 默认删除器 默认情况下,std::unique_ptr和std::shared_ptr使用以下方式进行删除: delete ptr; delete[] arr_ptr; 这些删除器在大多数情况下都很有用...std::unique_ptr p(new int, MyDeleter()); 这种方式的优点是类型安全和高效。...std::unique_ptr或std::shared_ptr的删除器。...std::unique_ptr p(new int, deleter); 这种方式的优点是简洁和直观。
领取专属 10元无门槛券
手把手带您无忧上云