C++ primer 读书笔记(5)
来源:互联网 发布:淘宝上怎么开店流程图 编辑:程序博客网 时间:2024/06/11 09:57
sizeof操作符
sizeof操作符返回的是一个size_t类型的值,这个值是个编译时的常量(compile-time constant),表示某类型或者变量所占空间的字节数。其使用可以有以下几种形式:
sizeof(类型名), sizeof(表达式), sizeof 表达式。
1. sizeof char 或者一个字符型变量返回的一定是1;
2. sizeof 一个reference返回其对应的变量类型大小;
3. sizeof 一个指针返回存储该指针所用空间,如果要求该指针所指对象的类型所占空间大小,要用到*操作;
4. sizeof 数组类型返回的即该数组元素类型大小乘以元素个数,所以可以通过sizeof数组类型除以sizeof其元素类型来得到该数组的元素数:
int sz=sizeof(ia)/sizeof(*ia); //此处说明sizeof的优先级比/高
逗号操作符
用逗号连接的表达式是从左至右进行的,返回值是最右表达式的值,最常用于for循环中
vecter<int> ivec(10);int cnt=ivec.size(); //这里cnt用来赋值给ivec,所以要用整型,即使ivec.size()返回的是vector<int>::size_typefor (vector<int>::size_type ix=0; ix!=ivec.size(); ++ix, --cnt) //ix不是用来赋值的,所以不用于cnt一样用int类型ivec[ix]=cnt;
new和delete
上一篇文章讲了我们可以用new和delete来创建和删除动态数组,我们同样可以用它们来创建和删除单个对象。与变量不同,这些动态创建的对象没有变量名,只有由new返回的一个指向该对象的指针。创建这些对象的形式如下:
int *pi=new int;string *pstr=new pstr;
我们也可以对其进行初始化:
int *pi=new int(1024); //将pi所指整型对象初始化为1024int *pi2=new int(); //将pi2所指对象初始化为0string *pstr=new string(10, '9'); //将pstr所指对象初始化为连续10个9的字符串string *pstr2=new string(); //将pstr2所指对象初始化为空字符串/*以上与内置类型的变量初始化基本相同,如果不初始化,则留下未初始化的对象*/cls *pc=new cls;cls *pc2=new cls(); //如果cls类有默认的构造函数,则以上两种表达方式是一样的,都使用默认构造函数对cls的对象进行初始化
如果要释放掉动态分配给某对象的内存,可以使用delete,还记得释放动态数组的时候使用的是delete [] arr吗?
int i;int *pi=&i;string str="hello world";double *pd=new double(33);delete pi; //错误,pi是指针,但不是指向动态分配的空间,这种错误编译器可能检测不出来delete str; //错误,事实上str不是指针,这个错误可以被编译器检测出来delete pd; //正确
在释放掉自由分配的空间后,原来指向该空间的指针变成了dangling pointer悬空指针,事实上只是释放了指针所指空间,而并没有改变指针的值,所以最好把该指针的值改为0,否则易引起错误。
隐式类型转换
C++中的有些类型是可以互相转换的,有时两个不同的类型参与同一个运算时,就要先把它们转换为同一个类型,而这种转换是编译器自动进行的,没有程序员的操作,所以称为隐式转换(implicit type conversions)。在一下三种情况下会发生隐式类型转换:
1. 同一表达式中有不同类型的操作数,如
int ival;double dval;ival>=dval //ival被转换为double
2. 当一个表达式被用作条件时,它会被转换为bool类型,如:
int ival;if (ival) //ival被转换为boolwhile (cin) //cin被转换为bool,这里cin是一个istream类的对象,但是可以根据IO库的定义来将istream类转换为bool类
3. 在初始化或赋值操作中,表达式将会被转换为被初始化或赋值的对象的类型,如:
int ival=3.14; //double型3.14被转换为整型3int *ip;ip=0; //整型0被转换为指针型NULL
细心的人可能会想到,在转换的过程中会有一个问题:如果一个带符号整数和一个无符号整数同时出现,应该怎么转换呢?我们知道,在类型转换过程中,有一个原则就是尽量保持精度,显然在同一个机器上unsigned int能表示的整数会比int大,只能由int转换为unsigned int,这样如果int类型的对象是个负数,那么就会被变成正数,这样的结果肯定是错误的,因此按书中的话来说,包含带符号和无符号整数的转换结果可能会“surprising”。
- c++primer读书笔记(5)
- C++primer读书笔记5
- 《C++Primer》读书笔记(5)
- C++Primer读书笔记(一)
- C++Primer读书笔记(三)
- C++Primer读书笔记(四)
- C++Primer读书笔记(五)
- C++Primer读书笔记(六)
- C++Primer读书笔记(七)
- C++Primer读书笔记(八)
- C++Primer读书笔记(九)
- C++Primer读书笔记(十)
- C++Primer读书笔记(十一)
- C++Primer读书笔记(十二)
- C++Primer读书笔记(十三)
- C++primer读书笔记(一)
- 《C++primer》读书笔记(1)
- 《C++Primer》读书笔记(2)
- reaver使用方法
- win7下制作ubuntu系统安装启动盘和U盘安装ubuntu全过程
- 理财的四个数字
- wxpython实现界面,读取excel配置文件并查询道具信息
- 取消gdb退出时提示
- C++ primer 读书笔记(5)
- Android App 性能优化
- 数据结构cp1
- Matlab2014 巡回研讨会记录
- Android TV开发随笔 序言
- 是满满的母爱与感动
- Linux视频教程在线观看Boobooke
- Codeforces 4
- round();用法