1.typedef

typedef用来定义同类型的同义词。如:

 typedef unsingned int size_t;
typedef int ptrdiff_t;
typedef T * iterator;

需要注意的是,不应该将typedef当做文本扩展来看待,如下例:

 typedef string * pstring;
const pstrng cstr;

此时第二行中cstr应该表示什么类型呢?若当做文本扩展,则会认为cstr表示const string *,即cstr是一个指针,指向一个const string对象。但是实际上,const修饰的是pstring类型,而pstring是一个string类型指针,则cstr应该表示的是一个指向string类型对象的const指针。

2.sizeof操作符

sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位为字节。

 //sizeof 操作符的三种用法
sizeof(type name);
sizeof(expr);
sizeof expr;
//eg.
string ss,*sptr;
int i;
sizeof(ss);
sizeof(string);
sizeof *sptr;
sizeof(i);
sizeof (int);

可以用sizeof操作符求一个数组的元素个数,如下:

 int a[];
int sz = sizeof(a)/sizeof(int);//sz == 10

3.显示类型转换(强制类型转换)

命名的强制类型转换符号一般形式如下:

 cast-name<type>(expression);

a.dynamic_cast

dynamic_cast操作符将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用或指针。

dynamic_cast与其他强制转换的不同之处在于,dynamic_cast涉及运行时类型检查。如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败。如果转换到指针类型的dynamic_cast失败,则dynamic_cast的结果为0值;如果转换到引用类型的dynamic_cast失败,则抛出一个bad_cast异常。看一个例子:

 class Base{
...
}; class Derived:public Base{
...
}; //Base *baseptr = new Base;
Base *baseptr = new Derived;
if (Derived *derivedPtr = dynamic_cast<Derived *>(baseptr)){
...
}else{
...
}

如果baseptr实际指向Derived对象,则转换成功;若baseptr指向Base对象,则转换失败。

b.const_cast

const_cast可以转换掉表达式中的const性质。举例如下:

 void process(string *sptr);
const string *csptr;
process(const_cast<string *>(cspttr));

函数process接受string*参数,若传给其一个const string *是不可以的,使用const_cast便可将const string*转换为string*。

b.static_cast

编译器隐式执行的任何类型准换都可由static_cast显式完成。

 double dval = 3.14;
char cval = static_cast<char>(dval);

还可用static_cast找回存放在void *指针中的值。

 double dval = 3.14;
void * ptr = &dval;
double *dp = static_cast<double *>(ptr);

4.c++中的三种new

a.new表达式

new表达式动态创建对象,返回指向新创建对象的指针,该对象创建于自由存储区。用new表达式创建的对象内存必须用delete表达式释放,如果忘记释放该对象,则就会造成内存泄露。当new表达式无法获取所需内存空间时,系统将抛出bad_alloc异常。

 int *pi = new int();
int *pj = new int;
string *ps = new string("");
string *psj = new string;

当使用new表达式的时候,实际发生了三个步骤。首先,表达式调用operator new()操作符函数分配足够大的未初始化内存,以保存指定类型的一个对象;接下来,运行该类型的一个构造函数,用指定初始化式在未初始化内存上构造对象;最后,返回指向新分配并构造的对象的指针。

b.operator new和operator delete

operator new用来获得未初始化的内存,它类似于allocator类中的allocate成员函数;operator delete用来释放内存,它类似于allocator类中的deallocate()成员函数。operator delete不会运行析构函数,因此在调用operator delete前应显示调用析构函数清除对象本身。operator new与operator delete的原型如下:

 void *operator new(size_t);
void *operator new[](size_t);
void *operator delete(void *);
void *operator delete[](void *); //eg.
string *ps = static_cast<string *>(operator new(sizeof(string)));
int sz = ;
int *pi = static_cast<int *>(operator new(sizeof(int)*sz));
operator delete[](pi);

c.定位new(placement new)

定位new表达式在已分配的原始内存中初始化一个对象。它与operator new的不同之处在于它不分配内存额对象,相反,它接受指向已分配但未构造的内存的指针,并在该内存中初始化一个对象。这与allocator类中的construct成员函数类似。定位new表达式形式如下:

 new (place_address) type;
new (place_address) type(initializer_list); //eg.
string *ps = static_cast<string *>(operator new(sizeof(string)));
new (ps) string("hello world");

c++相关知识回顾的更多相关文章

  1. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  2. 提问式复习:图文回顾 redo log 相关知识

    原文链接:提问式复习:图文回顾 redo log 相关知识 1.如何提升 redo日志 的写性能? 为了保证 redo日志 不丢失,会在磁盘中开辟一块空间将日志保存起来.但是这样会有一个问题,磁盘的读 ...

  3. MySQL学习总结:提问式回顾 undo log 相关知识

    原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...

  4. C#基础知识回顾-- 反射(1)

    C#基础知识回顾-- 反射(1)   反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...

  5. 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识

    从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...

  6. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  7. Java基础知识回顾之六 ----- IO流

    前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...

  8. Java基础知识回顾之五 ----- 多线程

    前言 在上一篇文章中,回顾了Java的集合.而在本篇文章中主要介绍多线程的相关知识.主要介绍的知识点为线程的介绍.多线程的使用.以及在多线程中使用的一些方法. 线程和进程 线程 表示进程中负责程序执行 ...

  9. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

随机推荐

  1. HTML5 移动应用开发环境搭建及原理分析

    开发环境搭建: 一.Android 开发平台搭建 安装java jdk:\\10.194.151.132\Mewfile\tmp\ADT 配置java jdk 1)  新建系统变量,JAVA_HOME ...

  2. Tornado源码探寻(准备阶段)

    上一篇从一个简单的例子大致了解到Tornado框架的一个概述,同时也看清了web框架的本质. 接下来,我们从tornado程序的起始来分析其源码: 一.概述 上图是摘自朋友的博客里的内容,这张图很明确 ...

  3. date 、cal、bc

    date cal date是显示日期与时间 date +%Y/%M/%D date +%Y/%m/%d date +%H:%M cal cal 2016

  4. spark高级排序彻底解秘

    排序,真的非常重要! RDD.scala(源码) 在其,没有罗列排序,不是说它不重要! 1.基础排序算法实战 2.二次排序算法实战 3.更高级别排序算法 4.排序算法内幕解密 1.基础排序算法实战 启 ...

  5. HDU 2298 Toxophily

    题目: Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bri ...

  6. Android中实现控件圆角边框

    首先,在drawable文件夹下新建一个xml文件: <?xml version="1.0" encoding="utf-8"?> <shap ...

  7. mysql 插入默认值的问题 sql-mode

    刚好碰到如果不给默认值mysql数据就插入不成功的问题,后来百度了很多,试了下结果 把my.ini里面的[mysqld]的sql-mode 换成下面的一行,如果没有则添加  sql-mode=&quo ...

  8. Codeigniter数据库操作

    //查询: $query = $this->db_query("SELECT * FROM table"); ================================ ...

  9. jvm内存GC详解

    一.相关概念  a. 基本回收算法 1. 引用计数(Reference Counting)  比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收 ...

  10. I2C和SCCB协议的小区别和误区

    I2C采用的是7位地址数据,首字节最低位代表读写位,第二字节SUB寄存器高位为1表示自动加subaddress SCCB采用的是8位地址数据,比如0x42,B01000010 使用I2C协议时,第一次 ...