C++ Primer第四章笔记

C++Primer第四章笔记 表达式

1. 左值与右值

当一个对象被用作右值得时候,用的是对象的值;当对象被用作左值的时候,用的是对象的身份。

2. 在一条语句里混用解引用和递增运算符

后置递增运算符的优先级高于解引用运算符,因此*<指针名>++等价于*(<指针名>++)
`cout << *iter++ << endl;     // 要习惯于这种写法`

3. 成员访问运算符

ptr->mem 等价于 (*ptr).mem

4. 位运算符

~位求反 <<左移 >>右移  &与  ^异或  |或

5. sizeof运算符

sizeof运算符返回一条表达式或一个类型名字所占的字节数。
sizeof(type);
sizeof expr;

Sales_data data,*p;
sizeof(Sales_data);//存储Sales_data类型的对象所占的空间大小
sizeof data;//data的类型大小
sizeof p;//指针所占的空间大小
sizeof *p;//p所指类型的大小,即sizeof(Sales_data)
sizeof data.revenue;//Sales_data的revenue成员对应类型的大小
sizeof Sales_data:revenue;//同上
  • 对char或者类型为char的表达式执行sizeof运算,结果为1
  • 对引用类型执行sizeof运算得到被引用对象所占空间的大小
  • 对指针执行sizeof运算得到指针本身所占空间的大小。
  • 对解引用指针执行sizeof运算得到指针所指向的对象类型所占空间的大小,指针不需要有效(可以为空)。
  • 对数组执行sizeof运算得到整个数组所占的大小,注意sizeof不会将数组转换为指针处理。
  • 对string对象或者vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。
    计算数组中元素的个数
    constexpr size_t sz = sizeof(ia)/sizeof(*ia);

6.类型转换

如果两种类型可以相互转换,那么它们就是关联的。
在下面这些情况下,编译器会自动地转换运算对象的类型:

  • 比int类型小的整型值被提升为较大的整数类型
  • 条件中,非布尔型转换为布尔类型
  • 初始化过程中,初始值转换成变量的类型;在赋值语句中,右侧运算对象转换为左侧运算对象的类型。
  • 如果算术运算对象有多种类型,需要转换为同一种类型。

算术转换
如果某个运算对象类型不一致,这些运算对象将转换成同一种类型。

  • 整型提升。如果类型匹配无须进一步转换
  • 如果一个运算对象是带符号类型,另一个对象是无符号类型。
    无符号>=有符号 >> 带符号的运算对象转换为无符号的
    无符号<有符号 >> 如果无符号都能存在于带符号中 >>无符号转化为带符号类型
    >> 否则 >>带符号类型转化为无符号

7.其他隐式类型转换

  • 数组转换为指针,在大多数用到数组的表达式中,数组会自动转换为直线数组首元素的指针。当数组被作为decltype关键字的参数,或者作为取地址符(&)、sizeof以及typeid(19章)等运算符的运算对象时,不会发生转化。
  • 指针转换。常量整型数0或者字面值nullptr能转换成任意类型指针;指向非常量指针能转换成void*;任意指针能转换成const void*;
  • 转换成常量。允许将指向非常量类型的指针转换成指向对应的常量类型的指针。
  • 类类型定义的转换。类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换

8.显示转换

命名的强制类型转换
cast-name(expression)
cast-name 包括:static_cast, dynamic_cast, const_cast, reinterpret_cast

  • static_cast
    任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
    double slope = static_cast<double> (j)/i; //
    将较大类型赋值给较小类型非常有用,如此就关闭了编译器发出的警告(精度损失),告诉编译器我知道并且不在乎损失
  • const_cast
    只能改变运算对象的底层const,将常量对象改为非常量对象。
  • reinterpret_cast
    为运算对象的位模式提供低层次上的重新解释
int *ip;
char *pc = reinterpret_cast<char*>(ip);//pc所指真实对象是一个int而非字符
string str(pc);//如果把pc当作普通的字符指针可能引起错误
  • 旧式类型转换
    type (expr);//函数形式的强制类型转换
    (type) expr;//C语言风格的强制类型转换
char *pc = (char *)ip;//ip是指向整数的指针
//效果与使用reinterpret_cast一样

建议程序员避免使用强制类型转换,减少错误的发生

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值