重载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”)的更多相关文章

  1. Java基础 -- 嵌套类(非静态嵌套类、静态嵌套类)

    可以将一个类的定义放在另一个类的内部定义,这样的类就被称为嵌套类,包含嵌套类的类被称为外部类(outer class),也可以叫做封闭类. 嵌套类可以分为两种: 静态嵌套类(Static Nested ...

  2. 【c++ Prime 学习笔记】第19章 特殊工具与技术

    某些程序对内存分配有特殊要求,不能直接使用标准内存管理机制 重载new和delete算符可控制内存分配的过程 19.1.1 重载new和delete 说法"重载new和delete" ...

  3. C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类

    特殊工具与技术 --嵌套类 能够在还有一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这种类是嵌套类,也称为嵌套类型.嵌套类最经常使用于定义运行类. 嵌套类是独立的类,基本上与它们 ...

  4. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  5. java基础(十一) 枚举类型

    枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...

  6. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  7. 《CLR via C#》读书笔记(6)类型和成员基础

    6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容 ...

  8. 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)

    十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...

  9. Java基础-零拷贝技术应用案例

    Java基础-零拷贝技术应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 零拷贝技术在Hadoop生态圈中很多组件得到应用,典型的比如kafka组件,它就很成功的应用了零拷贝 ...

随机推荐

  1. JAVA基础部分复习(五、JAVA反射)

    关于反射: 1.需要了解jvm类的加载机制(java高级部分会详细介绍) 2.反射的API其实只要多看看API和源码,很容易就懂了. 下面是代码,简单讲解反射的使用: import java.lang ...

  2. windows下前端开发工具遇到的问题总结(yeoman bower grunt)

    我用的是windows环境 一毕要环境: 1:nodejs 官网:https://nodejs.org/en/ 2:由于很多国外网站国内都访问不了(如果没有设置会出现很多奇怪的错误),所有必需FQ 我 ...

  3. [LeetCode&Python] Problem 427. Construct Quad Tree

    We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...

  4. 无用之flask

    Oldboy s4 Flask   Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收 ...

  5. linux-----初学命令和理解

    the following Codes has been confirmed by me 1.头部标识[pecool@demo ~]: 其中pecool代表登入用户:demo代表系统名称:~代表当前处 ...

  6. 【spring源码分析】spring和@PostConstruct注解

    @PostConstruct注解好多人以为是Spring提供的.其实是Java自己的注解. Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法.被@Pos ...

  7. bash常识

    文章目录 比较是否相等 = 字符串操作 字符串变量的截取操作 字符串替换 字符串比较 取长度 查找子串的位置 选取子串 fork, exec, source fork exec source 补充 其 ...

  8. 让Windows XP的键盘“说话”,全语音键盘

    长期面对无声的电脑,我们难免疲倦.如果正在输入的内容被系统一字(字母)不差地念出来,你还能在无声的疲倦中输入错误的内容吗?本文以Windows 2000/XP中一个鲜为人知的“讲述人”为例,来教你DI ...

  9. Windows git 初始设置

    主要布署在 Linux 服务器上时,将全局设置 为提交自动转为 LF,签出不转换.git config --global core.autocrlf input(无效了,按默认即可) 设置全局用户名.

  10. 高阶组件 Higher-order Components (HOC) 知识点

    官方介绍地址:https://reactjs.org/docs/higher-order-components.html