标准C++编程常量_指针_new_delete_函数
- 格式:doc
- 大小:262.50 KB
- 文档页数:6
const double *p; double *const p1; const double *const p2;有什么区别?
const double *p; //*p是个const,意思是不能通过*p修改p指向的对象
比如 double a=0.0; const double *p=&a; 那么*p=2.0是非法的
而如果有const double a=0.0;那么必须是 const double* 才可以指向a ,像d ouble*p =&a;是非法的
double *const p1; //p1是个const, p1的值不能改变,所以必须在定义p1的时候就初始化它:double *const p1=&某; 如果再有p1= 某地址; //这个就行不通
const double *const p2; //p2是个const,*p2也是const ,就是p2 的值不能改变,也不能通过*p2改变p2所指向的对象的值
一道C语言的例题:
在C语言的编译下,由于指针指向的地址,直接向地址修改值,导致值被修改。然而这段程序,在不修改程序代码的情况下,使用C++进行编译,由于C++的编译器做了大量的优化工作,而直接导致值为100. 优化工作为程序看到n的前面使用const做修饰,直接认为n 为常量,在接下来使用n的地方,直接使用这个值代替,而不直接再从内存中n的地址处再取一遍n的值,所以我们看到的就是100.那么我们要怎么样才能使n的值从地址处再取一遍呢?
内存中取变量值。
强制类型转换
在C语言中强制类型转换很常见,但是在C++中强制类型转换却是很少见的,甚至很反感的。C++认为强制类型转换应该出现在底层的代码中,而不应该出现在软件开发中。C++认为在软件开发中不应该出现强制类型转换的,至少不应该胡乱出现。C++提倡不要进行类型转换,直接设臵正确的类型。
在C++中进行强制类型转换可以使用以下四个函数实现。
Static_cast用来进行数值类型之间的转换,或者有一方是void*指针类型之间的转换。
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。static_cast < type-id > ( expression )
Const_cast用于临时去掉const或volatile限制,就是临时将常量转换成变量。就是在这个语句内时const限制被去掉了,跳出这个语句,const限制仍然存在。
用法:const_cast
该运算符用来修改类型的const或volatile属性。除了const 或volatile 修饰之外, type_id和expression的类型是一样的。
一、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
二、常量引用被转换成非常量的引用,并且仍然指向原来的对象;reinterpret_cast用于任意两种指针类型之间的转换或者是指针类型与数值类型之间的转换。(最危险的转换,一般不使用)
einterpret_cast
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
Dynamic_cast 用于赋值类之间的转换
dynamic_cast < type-id > (expression)
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;
如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
dynamic_cast运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast 更安全。
C++的头文件实在C语言的头文件基础上去掉.h并在头文件名开始出加上一个c 即可。
所以不能这么写。
逻辑运算符
and_eq、or_eq、xor_eq是关键字,在有一些电脑中没有运算符下,可以使用这些关键字代替。在为函数取名时不要使用这些关键字(注意点)。
New和delete
new 类型 <==> (类型*)malloc(sizeof(类型))
这两种函数都是申请空间。new是C++中的,而malloc则是在C语言中的。
这两个函数是等效的。
New还可以用来初始化刚开辟的空间
Int* r=new int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址放入r中。
new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址
C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用delete,回收用 new[] 分配的一组对象的内存空间的时候用
delete[]。我们一般在delete以后,将该释放指针设置为NULL,应为delete以后,该指针变为了悬空指针,变得不安全,将其变为空指针会安全一些。
注意:不是用new申请的空间就不要去使用delete。用c的malloc来申请的空间要用free来释放。必须配对才可以。
1)文件cstring,和string.h对应,c++版本的头文件,包含比如strcpy 之类的字符串处理函数
2)文件string.h,和cstring对应,c版本的头文件,包含比如strcpy 之类的字符串处理函数
3)文件string,包含std::string的定义,属于STL范畴
string.h是C语言中字符串操作函数的头文件
cstring是c++对C语言中的strcpy之类的函数申明,包含cstring之后,就可以在程序中使用C语言风格的strcpy之类的函数。