C++ primer 读书笔记(5)

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_type
for (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所指整型对象初始化为1024
int *pi2=new int();    //将pi2所指对象初始化为0
string *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被转换为bool
while (cin)    //cin被转换为bool,这里cin是一个istream类的对象,但是可以根据IO库的定义来将istream类转换为bool类

3. 在初始化或赋值操作中,表达式将会被转换为被初始化或赋值的对象的类型,如:

int ival=3.14;    //double型3.14被转换为整型3
int *ip;
ip=0;    //整型0被转换为指针型NULL

细心的人可能会想到,在转换的过程中会有一个问题:如果一个带符号整数和一个无符号整数同时出现,应该怎么转换呢?我们知道,在类型转换过程中,有一个原则就是尽量保持精度,显然在同一个机器上unsigned int能表示的整数会比int大,只能由int转换为unsigned int,这样如果int类型的对象是个负数,那么就会被变成正数,这样的结果肯定是错误的,因此按书中的话来说,包含带符号和无符号整数的转换结果可能会“surprising”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值