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”。

0 0
原创粉丝点击