1、类型转换:
-
非布尔值转换为布尔值,初始值为零,则为FALSE;否则为true。
-
布尔值付给非布尔值时,false则结果为0,true则结果为1。
-
浮点数赋给整数,取小数点之前的部分。
-
整数赋给浮点数,小数部分记为零,也有可能超出浮点数的容量,损失精度。
-
赋给无符号类型一个超出其范围的值时,结果是对无符号类型表示数值的取模后的余数。 p33
-
2、c++定义了初始化几种不同的形式,例如:
int i=0;
int i={0};
int i{0};
int i(0); p39
3、标识符:
标识符由字母、数字、下划线组成,只能以字母或下划线开头。
标识符不能出现两个连续的下划线,也不能以下划线紧邻大写字母开头。
函数体外不能以下划线开头。 p42
4、复合类型: p45
-
引用:引用必须完成初始化,且只能绑定在对象上,不能与字面值绑定在一起。
如错误的引用形式: int &refval =10;
引用本身不是一个对象,它始终绑定在初始的对象上面。
2.指针
-
指针的引用和指针的指针https://www.cnblogs.com/li-peng/p/4116349.html p53
-
生成空指针的三种方法:
int *p1=nullptr;
int *p1=0;
int *p3=NULL;
在新标准下,现在的c++程序最好使用 nullptr,避免使用NULL。
-
建议在定义对象后再定义指向他的指针,如果不清楚指针指向何处,那么最好将其初始化为一个空指针。
3.void* 指针
void 类型的指针可以存放任意类型的地址,但不能对其所指的对象进行操作,因为无从得知其所指对象的类型。 p50
5、我们需要分清数据类型 与 修饰符之间的区别:
如:int* p, i, &m=i;
int 是数据类型,而像*,&是修饰符,它们仅仅修饰了紧跟其后的变量而对整条语句不起作用。 p53
6、const限定符 p56
1、const的引用:
const int ci =1024;
const int &ri=ci; //正确
ri=42; //错误
int &r2 = ci; //错误 非常量引用常量
我们对引用绑定的不同情况进行测试
int main()
{
int i=42;
const int &r1 = i;
const int &r2 = 42;
const int &r3 = r1*3;
cout<<"r1= "<<r1<<endl;
cout<<"r2= "<<r2<<endl;
cout<<"r3= "<<r3<<endl;
/*以下改变i的值以观察常量应用的变化*/
cout<<"以下改变i的值以观察常量应用的变化 i=0\n"<<endl;
i=0;
cout<<"r1= "<<r1<<endl;
cout<<"r2= "<<r2<<endl;
cout<<"r3= "<<r3<<endl;
return 0;
}
结果为
结论:对于常量引用 r1 它实际上绑定在了 i 这个对象上,即与它相同类型的非常量 ;而对于 r2 , r3 都被绑定在生成的临时量 temp 上,因此 i 的值的变化不能改变 r2 ,r3 的值。
对于普通的非常量引用有诸多的限制,实际上它只能被绑定在与它类型一致的对象上。
int i=40;
const int c1=32;
int &r1=42; //错误
int &r2=i*6; //错误
int &r3=c1; //错误
int &r4=i; //正确
6、指向常量的指针 p56
-
存放常量的地址只能使用指向常量的指针。
const double pi=3.14; //定义一个常量
double *ptr = π //错误:ptr是一个普通指针
const double *cptr=π //正确
*ptr = 42; //错误不能改变常量的值
-
指向常量的指针能指向一个非常量
double dval = 3.14;
cptr = &dval;
-
我们都不能通过指向常量的指针改变指向对象的值。
7、常指针
定义:int i=0;
int *const p = &i;
如果所指的对象是非常量,我们可以通过常指针改变对象的值,但不能改变指针的值。p57