注意制定每个规则背后的原因。
(1)没有所有的元素都是引用的数组。
(2)数组的维数必须是大于等于1的常量表达式定义。非const变量以及要到运行时才知道其值的const变量都不能用于定义数组的维数。
(3)数组不允许直接赋值。char a[] = {'a'}; 一个字节 ;char a = "a";两个字节
(4)指针用于指向单个对象,而迭代器只能用于指向容器内的元素。
(5)string* s, p;一个指针,一个string对象。
(6)把int型变量赋给指针是非法的,尽管此int型变量的值为0。但允许把数值0或在编译时可获得0值的const量赋给指针。
(7)指针的类型用于确认指针所指对象的类型,因此初始化或者赋值时必须保证类型匹配。void类型指针可以保存任何对象的地址,但不允许使用它操作它所指向的对象。
(8)在表达式中使用数组名时,该名字会自动转换为指向该数组的第一个元素的指针。
(9)在使用下标访问数组时,实际上是对数组元素的指针做下标操作。只要指针指向数组元素,就可以对它进行下标操作。 int k = p[-2];
(10)把一个const对象的地址赋给一个普通的,非const对象的指针会导致编译错误。
(11)不能用void型指针保存const对象的地址。
(12)允许把非const对象的地址赋给指向const对象的指针。
(13)不能保证指向const的指针所指对象的值一定不可修改。
(14)与任何const量一样,const指针也必须在定义时初始化。
(15)指针所指对象的值能够修改完全取决于该对象的类型。
(16)typedef string *p; const p str; ----------------string *const str;
(17)C++语言通过 const char* 类型的指针来操作C风格字符串。
(18)string *p = new string[10];int *p = new int[10]; int *p = new[10]();区别:动态分配数组的类类型必须有默认构造函数
(19)const int *p = new int[10]; 错误 const int *p = new int[10]();
(20)char s[0];不行啊 char *p = new char[0];可以
(21)delete []a;漏掉方括号,会导致内存泄露,编译不出错,运行才出错(why)
(22)int ia[3][3]; int (*p)[3] = ia; int *p = &ia[0]; 不行 int (*p)[3] = &ia[0]; int *p = ia[0]; int *p = ia;不行(思考原因)
(23)表达式的结果是右值,可以读取该结果值,但不能对其赋值。
(24)每个操作符都控制了其假定的求值次序,即我们是否可以假定左操作数总是先于右操作数求值。大部分的操作符无法保证某种特定的求值次序。
(25)%操作数只能为整型。
(26)/和%:如果两个操作符的两个操作数都是正数,则结果也都为正数,若都为负数,除法操作结果为正,求余操作结果为负。
(27)逻辑与和逻辑或的短路求值特性。
(28)关系操作符的左结合特性。if (x < y < z),若z大于1,永远为真。
(29)位操作符使用整型操作数,左操作数可为正数可为负数,最好为正数,因为如何处理符号位依赖于机器。右操作数必须为正数,且严格小于左操作数位数的值。
(30)cout << 10 < 42; 1024 = ival; i + j = ival;有错
(31)数组名是不可修改的左值,因此数组不可用做赋值操作的目标。
(31)赋值操作符的值是其左操作数的值,其结果的类型是左操作数的类型。int i; int *j; i = j = 0;有错
(32)使用符合赋值操作符时,其左操作数只计算一次,相似的表达式则计算两次。
(33)++i; i++; *iter++;区别
(34)cout << (i < j ? i : j); cout << (i < j) ?i : j; cout << i < j ? i : j; 输入输出操作符的优先级????
(35)逗号表达式的结果是其最后边表达式的值。
(36)优先级口诀:去掉一个最高的,去掉一个最低的,一,二,三 ,赋值。二元操作的顺序为 算术,关系,逻辑。中间插入移位和逻辑位。
(37)int *p = new int; int *p = new int(); int x(); const int *p = new const int(1024); delete p; 记得删除后置0.
(38)显示转换
dynamic_cast:将基类类型的引用或指针安全的转换为派生类型的引用或指针。(typeid操作符)
const_cast:去除掉const属性。
static_cast:强制转换,告诉编译器,我们知道并不关系潜在的精度损失。
reinterpret_cast:为操作数的位模式提供较低层次的重新解释。int *i; char *c = reinterpret_cast<char*>(p)。