C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)
重载new和delete
1调用operator new( 或new[])标准库函数分配足够大的、原始的、未命名的内存空间以便存储特定类型的对象
2编译器运行相应地构造函数以构造这些对象,并为其传入初始值
3返回一个指向该对象的指针
可以在全局作用域定义operator new,也可以定义为成员函数
如果是类类型,首先在本类及其基类中查找,否则在全局域中查找,最后使用标准库定义版本。
//这些版本可能抛出异常
void *operator new(size_t);
void *operator new[] (size_t);
void operator delete(void) noexcept;
void operator delete[] (void) noexcept;
//这些版本承诺不抛出异常
void *operator new(size_t, nothrow_t&) noexcept;
void *operator new[] (size_t, nothrow_t&) noexcept;
void operator delete(void, nothrow_t&) noexcept;
void operator delete[] (void, nothrow_t&) noexcept;
nothrow_t是定义在new头文件的一个struct,不包含任何成员。还包含一个nothrow的const对象,可以通过这个对象请求new的非抛出版本。
int *p=new (nothrow) int;//(这种形式的new就叫定位new,提供额外参数)
当定义成类的成员时,是隐式静态的。
自定义operator new可以提供额外的参数。此时用到这些自定义函数的new表达式必须使用new的定位形式,将实参传给新增的形参。
void* operator new(size_t, void)形式不允许重载,其他都可以。
operator delete返回类型必须void,第一个形参必须void*。如果是定义为类的成员,还可以包含另外一个size_t的形参。
重载不能改变new和delete运算符的基本含义。
operator new和delete必须以某种方式执行分配内存与释放内存的操作。
定位new
new(place_address) type
new(place_address) type (initializers)
new(place_address) type [size]
new(place_address) type [size] {braced initializer list}
place_address必须是指针,定位new调用void* operator new(size_t, void*)这是一个我们无法自定义的operator new版本
该函数不分配任何内存,它只是简单地返回指针实参;然后由new表达式负责在指定地址初始化对象。允许我们在一个特定的、预先分配的内存地址上构造对象。
定位new与allocator区别
传给construct的指针必须指向同一个allocator对象分配的空间
但是传给定位new的指针无须是operator new分配的内存
RTTI
typeid运算符,返回表达式的类型
dynamic_cast运算符,将基类指针或引用安全地转换成派生类的指针或引用
特别适用于我们想使用基类对象的指针或引用执行某个派生类操作并且该操作不是虚函数。
潜在风险:必须清楚地知道转换的目标类型,并且必须检查类型转换是否被成功执行。
dynamic_cast<type*> (e);
dynamic_cast<type&> (e);//e必须左值
dynamic_cast<type&&> (e);//e不能左值
指针类型转换失败,返回0;引用类型转换失败,抛出一个bad_cast
if(Derived dp=dynamic_cast<Derived> (bp))
{}
else
{}
在条件语句中执行操作,可以确保类型转换和结果检查在同一条表达式中完成。dp在外部不可访问,即时忘了做相应判断,也确保安全。
typeid
作用域对象,结果是一个常量对象的引用。
顶层const忽略;如果是引用返回引用所引对象的类型;数组或函数不做指针转换
typeid是否需要运行时检查决定了表达式是否会被求值。
虚函数必须具有相同的形参,所以只能使用基类的成员,而不能使用派生类独有的。
使用typeid判断,再使用dynamic_cast转换
type_info没有默认构造,拷贝移动构造及赋值运算都定义为删除的。创建对象的唯一途径是使用typeid运算符。
其他
- 限定作用域的枚举类型,遵循常规作用域准则
int I = color::red;//不限定作用域的枚举隐式地转换成整型
Int j= peppers::red;//限定作用域的枚举不会进行隐式转换
- 前置声明
不限定作用域的必须制定成员类型,限定作用域的可以使用默认的int
enum intValues : unsigned long long;
enum class open_modes;
- 类成员指针
指向类的非静态成员的指针,并没有指向任何数据,只有当解引用时才提供对象的信息。
成员函数与指向成员函数的指针之间不存在自动转换规则。
可以使用类型别名,做成成员指针函数表,使代码更易读写
用作可调用对象
1function<bool (const string&)> fcn =&string::empty;
find_if(svec.begin(), sevc.end(), fcn);
function<bool (const string)> fcn =&string::empty;
find_if(pvec.begin(), pevc.end(), fcn);
使用function为成员函数生成一个可调用对象必须先翻译代码,使隐式形参变成显示
可以理解为类的成员函数有两个重载版本,需要确定用哪一个
2mem_fn
auto f =mem_fn(&string::empty);
f(svec.begin());
f(&svec[0]);
含有一对重载的函数调用运算符
3bind
auto it =find_if(svec.begin(), sevc.end(), bind(&string::empty, _1);
- 嵌套类
嵌套类的名字在外层类作用域中是可见的,外层类作用域之外不可见
嵌套类必须声明在类的内部,但是可以定义在类的内部或外部
如声明了静态成员,定义需在外层类的作用域外
不在类的作用域内需要加前缀
- union
union不能含有引用类型的成员,默认公有
可以定义成员函数,但不能继承自其它类也不能作为基类,不能含有虚函数
匿名union,编译器自动为该union自动创建一个未命名对象。定义所在作用域内可以直接访问其成员。
对于union,构造和销毁类类型成员必须执行复杂的操作,通常使用类来管理
- 局部类
定义在某个函数内部,所有成员必须完整定义在类的内部,不能有静态数据成员。
只能访问外层作用域定义的类型名、静态变量以及枚举类型
- 不可移植特性
位域,成员名字之后紧跟冒号以及一个常量表达式,最好设为无符号类型
volatile跟const用法类似,只有volatile成员函数才能被volatile对象调用
区别,不能使用合成的拷贝移动构造函数及赋值运算初始化化volatile对象或从volatile对象赋值。合成的成员接受的形参类型是(非volatile常量引用)
链接指示 extern “C”
需要调用其他语言编写的函数,也必须在C++中进行声明,且必须指定返回类型和形参列表
可单个可复合
extern “C”
{
int strcmp(const char*, const char*);
}
多重声明可以应用于整个头文件,链接指示可以嵌套
语言是函数类型的一部分,C函数的指针与C++函数的指针是不一样的类型
extern “C” void f1(void(*)(int));
链接指示对整个声明都有效,包括形参。
想在C++函数中传入C函数的指针,必须使用类型别名
C和C++中编译同一个源文件,可以在编译C++版本的程序时预处理器定义__cplusplus(两个下划线),条件编译
#ifdef __cplusplus
extern “C”
#endif
int strcmp(const char*, const char*);
C/C++基础----特殊工具和技术 (重载new和delete,RTT,限定作用域的枚举类型,类成员指针,嵌套类,局部类,volatile,链接指示 extern “C”)的更多相关文章
- Java基础 -- 嵌套类(非静态嵌套类、静态嵌套类)
可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested ...
- 【c++ Prime 学习笔记】第19章 特殊工具与技术
某些程序对内存分配有特殊要求,不能直接使用标准内存管理机制 重载new和delete算符可控制内存分配的过程 19.1.1 重载new和delete 说法"重载new和delete" ...
- C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
特殊工具与技术 --嵌套类 能够在还有一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这种类是嵌套类,也称为嵌套类型.嵌套类最经常使用于定义运行类. 嵌套类是独立的类,基本上与它们 ...
- 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错
原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...
- java基础(十一) 枚举类型
枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...
- 重载运算符:类成员函数or友元函数
类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...
- 《CLR via C#》读书笔记(6)类型和成员基础
6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容 ...
- 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)
十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...
- Java基础-零拷贝技术应用案例
Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...
随机推荐
- SEO:网站优化内容
一.内部优化 (1)meta标签优化:例如:TDK等的优化: 首页:网站名称 或者 网站名称_提供服务介绍or产品介绍 . 频道页:频道名称_网站名称. 文章 ...
- lesson3-神经序列模型I-小象
优化目标函数: batch gradient descent:必须便利all训练数据 -->随机梯度下降,但不稳定~一个数据点就更新,快但不稳定-->minibatch,取m个随机数据点, ...
- ubuntu shell插件
1. NetSpeed 在状态栏显示当前网速 2. Screenshot Tool 同样在 Ubuntu 18.04 之前我们使用 Shutter,但在Ubuntu 18.04 Shutter的托盘图 ...
- (18)模型层 -ORM之msql 多表操作(字段的属性)
数据库表的对应关系 1.一对一 #关联字段写在那张表都可以 PS:只要写OneToOneField就会自动加一个id 2.一对多 #关系确立,关联字段写在多的一方 3.多对多 #多对多的关系 ...
- 【HDOJ4857】【反向拓扑排序】
http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- 《DSP using MATLAB》Problem 6.4
结论: 正常直接II型流图和转换直接I型非常相似:正常直接I型流图和转换直接II型非常相似.
- 安装排错 max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
https://blog.csdn.net/cookzrk/article/details/80179006 转载:https://my.oschina.net/u/2510243/blog/8105 ...
- cmake 创建并调用动态库和静态库
编程之路刚刚开始,错误难免,希望大家能够指出. 刚刚开始学习cmake,写这篇之前我认真的看了“小代码2016”的博客,感觉很不错,看完之后我自己练习了一遍,记录一下. 1.首先建立好合适的目录结构, ...
- HIDL学习笔记
一.HIDL简单介绍 HIDL是Android8.0新出的一个技能,以service和client的方式实现hal接口,目的是想使Android系统和BSP解绑,使系统升级更加方便.HIDL的使用方法 ...
- 数据格式转换(一)PDF转换技术
PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式. 这样的文件格式与操作系统平台无关.这一特点使它成为在Internet上进行电子文档发行 ...