全部博文(21)
分类: C/C++
2012-12-13 21:23:50
1.如果求模的结果随分子的符号,则取出来的值向零一侧值,反正向负无穷取值.
2.左移操作符(<<)在右边插入0以补空位.对于右移操作符,如果其操作数是无符号数,则从左边插入0,如果操作叔叔有符号数,则插入符号位的副本或0值,如何选择需依据具体的实现而定.
3.与下标和解引用操作符一样,赋值操作符也返回左值.(if (i = 1)和if(i== 1)的区别
4.自增运算符记住一个例子: i = (i++) + a + b;
5常见的几种与动态内存相关的错误
1).删除指向动态分配内存的指针失败,因而无法将该内存返还给自由存储区.
2).读写已删除的对象.如果删除指针指向的对象之后,将指针置为0,则容易检测出此类错误
3).对同一内存空间使用两次delete表达式.当两个指针指向同一个动态创建的对象时删除就会发生错误. 注意:一旦删除了指针所指向的对象,立即将指针置为0,这样就清楚的表明了指针不再指向任何对象.
5.显式类型转换:
1).dynamic_cast:支持运行时识别指针或引用所指向的对象
2).const_cast:将转化掉表达式的const性质
3).static_cast:编译器隐式执行的任何类型转换都可以由static_cast显式完成.
4).reinterpret_cast:通常为操作数的位模式提供较低层次的重新解释
c++ 中箭头操作是个复合操作,将解引和调用组合调用了
myclass clsobj ;
myclass *cls = &clsobj ;
cls->show() ; // 等价于(*cls).show()
2. sizeof操作
返回一个对象或类型名的长度,这个操作比较重要,可以查看这篇文章
3. new和delete
new和delete运算符用于动态分配和撤销内存的运算符
Ønew用法:
开辟单变量地址空间
int *a = new int ; // 开辟一个存放数组的存储空间,返回一个指向该存储空间的地址. (和对象初始化一样:内置类型是否全局决定是否初始化,类类型无论如何都会调用默认构造函数来初始化)
int *a = new int(5) ; // 作用同上,但是同时将整数赋值为5
const int *a = new const int(5) ; // 作用同上,但是定义的是一个常量整数
开辟数组空间
一维: int *a = new int[100] ; // 开辟一个大小为100的整型数组空间
二维: int **a = new int[5][6] ;
三维及其以上:依此类推.
一般用法: new 类型 [初值]
Ø delete用法:
int *a = new int;
delete a; //释放单个int的空间
int *a = new int[5] ;
delete [] a ; //释放int数组空间
动态创建的对象不会被系统自动回收(即使动态变量已经超出了有效范围也不会)因此一定要手动 delete 如果忘记了该释放步骤系统内存可能会很快耗尽。
虽然回收了动态内存,但是这时候指针依然指向原来的地址叫做悬垂指针。如果在对该指针做操作可能会破坏内存数据。因此释放了数据空间后应该让指针指向 0 (a = 0)
4. 类型转换
分为隐式转换和显示转换
Ø隐式转换无需程序员介入系统自动实现转换例如:
char a ='a' ;
int b(a) ;
double c = b ;、
隐式转换常发生在小转大的同类类型之间,子类转父类,数组和对应指针,枚举到整形,任意结果到布尔值的转换等等。
Ø显示转换需要借助系统提供的转换函数来实现
static_cast、dynamic_cast、reinterpret_cast和const_cast
点击(此处)折叠或打开
点击(此处)折叠或打开
点击(此处)折叠或打开