c++相关知识回顾
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++相关知识回顾的更多相关文章
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- 提问式复习:图文回顾 redo log 相关知识
原文链接:提问式复习:图文回顾 redo log 相关知识 1.如何提升 redo日志 的写性能? 为了保证 redo日志 不丢失,会在磁盘中开辟一块空间将日志保存起来.但是这样会有一个问题,磁盘的读 ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- C#基础知识回顾-- 反射(1)
C#基础知识回顾-- 反射(1) 反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...
- 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识
从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识回顾之六 ----- IO流
前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...
- Java基础知识回顾之五 ----- 多线程
前言 在上一篇文章中,回顾了Java的集合.而在本篇文章中主要介绍多线程的相关知识.主要介绍的知识点为线程的介绍.多线程的使用.以及在多线程中使用的一些方法. 线程和进程 线程 表示进程中负责程序执行 ...
- C++ 基础知识回顾总结
一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...
随机推荐
- java解惑
java对转义字符没有提供任何特殊处理.编译器在将程序解析成各种符号之前,先将 Unicode 转义字符转换成为它们所表示的字符[JLS 3.2] 阅读笔记
- ubuntu如何跑arm程序
1. 首先确定一间配置好arm linux 交叉编译器,可以使用arm-linux-gcc. 2. 看示例代码hello.c #include<stdio.h> int add(int a ...
- 鸟哥的Linux私房菜 第十八章、认识系统服务 (daemons)
什么是 daemon 与服务 (service) Linux Daemon (守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些事件.它不需要用户输入就能运行 ...
- DateTime.TryParseExact 万能时间格式转化
本文转载:http://blog.csdn.net/gaofang2009/article/details/6073231 前天同事问C#有没有相关的方法能把"年月日时分秒"这样的 ...
- richTextBoxFontClass
使用 private void button1_Click(object sender, EventArgs e) { RichTextBoxCtrl.richTextBoxFontClass r = ...
- Centos安装成功mysql-5.5.37
摘自http://www.2cto.com/os/201404/296364.html(原文请关注) 这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅 Mysql5.5.37安 ...
- [Webpack 2] Maintain sane file sizes with webpack code splitting
As a Single Page Application grows in size, the size of the payload can become a real problem for pe ...
- rpm安装mysql 默认安装目录
MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为Linux本身的目录结构就比较 ...
- Day05 - Python 常用模块
1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...
- magic_quotes_runtime(魔术引号开关)
我们可以通过以下代码来探测php环境中magic_quotes_runtime是否开启: magic_runtime.php 源代码如下: <?php //当magic_quotes_runti ...