箭头操作符(->):
指向对象的一个指针,通过解引用获取该对象,然后使用点操作符(object.opterator())调用对象的成员函数。例如:
ClassName *sp=classObject;
(*sp).operator();
箭头操作符则一步获取该对象和使用该对象的成员函数,例如:
sp->operator();
sizeof操作符
sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型是size_t,长度的单位是字节,sizeof表达式的结果是编译时常量。
sizeof(type name)
sizeof(expr)
sizeof expr;
例如:
ClassName item,*p;
sizeof(ClassName);
sizeof item;
sizeof *p;
将sizeof用于expr时,并没有计算表达式expr的值,特别是在sizeof *p中,指针p可以持有一个无效地址,因为不需要对p做解引操作。
sizdof使用注意事项:
1.对char类型或值是char类型的表达式做sizeof操作保证得1.
2.对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小。
3.对指针做sizeof操作将返回存放指针所需的内存大小;注意,如果要获取该指针所指向对象的大小,则必须对指针进行解引操作。
4.对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数,应为sizeof返回整个数组在内存中的存储长度,所以用sizeof数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数。例如:
//ia是一个数组
int sz=sizeof(ia)/sizeof(*ia);
new和delete表达式:
new是动态创建对象,也就是想自由存储空间(是堆吗?)申请内存,delete撤销动态创建的对象(也就是通过new创建的对象)。
删除零值指针是安全的。
注意:一旦删除了指针所指向的对象,立即将指针值为0,这样就非常清楚地表明指针不再指向任何对象了。
强制转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
强制转换格式:cast_name<type>(expression);
其中cast_name为强制转换符之一(static_cast、dynamic_cast、const_cast、reinterpret_cast),type为转换的目标类型,expression则是被强制转换的值。
1.dynamic_cast:
dynnamic_cast支持运行时识别指针或引用所指向的对象。
2.const_cast:
const_cast将转换掉表达式的const性质。例如:
const char*pc_str;
char *pc=string_copy(const_cast<char*>(pc_str));
只有使用const_cast才能将const性质转换掉。在这种情况下,试图使用其他三种形式的强制转换都会导致编译时错误。除了添加或删除const特性,用const_cast符来执行其他任何类型转换,都会引起编译错误。
3.static_cast
编译器隐式执行的任何类型转换都可以有static_cast显示完成。
double d=97.0;
char ch=static_cast<char>(d);
通过static_cast将存放在void*中的指针值强制转换为原来的指针类型,此时我们应确保保持指针值,也就是说强制转换的结果应该与原来的地址值相等。
4.reinterpret_cast:
reinterpret_cast通常为操作数的位模式提供较低层次的重新解释。
reinterpret_cast本质上依赖于机器,要求程序员完全理解所涉及的数据类型,以及编译器实现强制转换的细节。
注:避免使用强制类型转换。
#include<iostream>
#include<string>
using std::string;
int main(){
// std::cout<<24%4/2<<std::endl;
int i=0;
//错误,不能为字面数值赋值
// if(42=i){}
//先赋值,然后判断i的值是否是true
if(i=42){}
// std::cout<<sizeof(byte)<<std::endl;
std::cout<<sizeof(short)<<std::endl;
std::cout<<sizeof(int)<<std::endl;
std::cout<<sizeof(long)<<std::endl;
std::cout<<sizeof(float)<<std::endl;
std::cout<<sizeof(double)<<std::endl;
std::cout<<sizeof(bool)<<std::endl;
std::cout<<sizeof(char)<<std::endl;
int x[10];
int *p=x;
//输出数组长度
std::cout<<sizeof(x)/sizeof(*x)<<std::endl;
//获取存放指针所需的内存大小和获取指针内对象的内存大小
std::cout<<sizeof(p)/sizeof(*p)<<std::endl;
string s="word";
string pl=s+(s[s.size()-1]=='s'?"":"s");
std::cout<<pl<<std::endl;
return 0;
}
C++第十一天 表达式
最新推荐文章于 2023-10-18 15:25:41 发布