本人目前还是学生,能力有限,有不足或者错误的地方欢迎大家指正,谢谢大家!
1、指针
int a(5); int *pa=&a; 等同于int a(5);int *p; p=&a;
*有两个含义:在定义时,*表示定义的变量为指针变量(可以看作是一种类型),如:int *p;表示p是一个指针。在执行中*是运算符(访址运算)*p表示访问p内容所指向的内存单
元。如有int *pa,则我们有三个值可以使用:pa为变量pa的内容(其值是一个地址,&a),&pa为变量pa的地址,*pa为pa所指向的内容(即为变量a的值5)。
2、释放内存
动态创建的对象用完后,应该释放内存,delete pi;该命令释放 pi 指向的 int 型对象所占用的内存空间。
如果指针指向不是用 new 分配的内存地址,则在该指针上使用delete 是不合法的。
如果指针的值为 0,则在其上做 delete 操作是合法的,但这样做没有任何意义: int *ip = 0; delete ip;
3、悬垂指针
删除指针后,该指针变成悬垂指针。悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了。悬垂指针往往导致程序错误,而且很难检测出来。
一旦删除了指针所指向的对象,立即将指针置为 0,这样就非常清楚地表明指针不再指向任何对象。
4、删除 const 对象
尽管程序员不能改变 const 对象的值,但可撤销对象本身。如同其他动态对象一样, const 动态对象也是使用删除指针来释放的:
delete pci; // ok: deletes a const object
即使 delete 表达式的操作数是指向 int 型 const 对象的指针,该语句同样有效地回收 pci 所指向的内容。
5、隐式类型转换
编译器在必要时将类型转换规则应用到内置类型和类类型的对象上。在下列情况下,将发生隐式类型转换:
a 在混合类型的表达式中,其操作数被转换为相同的类型:
int ival;
double dval;
ival >= dval // ival converted to double
b 用作条件的表达式被转换为 bool 类型:
int ival;
if (ival) // ival converted to bool
while (cin) // cin converted to bool
c 操作符
条件操作符(?:)中的第一个操作数以及逻辑非(!)、逻辑与(&&)和逻辑或(||)的操作数都是条件表达式。出现在 if、while、for 和 do while 语句中的同样也是
条件表达式。
d 可将算术对象转换为bool类型,bool对象也可以转换为int型。如bool b=true; int a=b;//a=1 int a=1;if(a){....}//a=true
e 用一表达式初始化某个变量,或将一表达式赋值给某个变量,则该表达式被转换为该变量的类型。
6、指针转换
在使用数组时,大多数情况下数组都会自动转换为指向第一个元素的指针:
int ia[10]; // array of 10 ints
int* ip = ia; // convert ia to pointer to first element
不将数组转换为指针的例外情况有:数组用作取地址(&)操作符的操作数或 sizeof 操作符的操作数时,或用数组对数组的引用进行初始化时,不会将数组转换为指针。
我们将在第 7.2.4 节学习如何定义指向数组的引用(或指针)。C++ 还提供了另外两种指针转换:指向任意数据类型的指针都可转换为 void* 类型;整型数值常量 0 可
转换为任意指针类型。
7、命名的强制类型转换符号的一般形式如下:
cast-name<type>(expression);
其中 cast-name 为 static_cast、dynamic_cast、const_cast 和reinterpret_cast 之一,type 为转换的目标类型,而 expression 则是被强制转换的值。
强制转换的类型指定了在 expression 上执行某种特定类型的转换。
今天就到这里,有不足的地方还请指正,谢谢大家!