const int ci = 1024; const int &r1 = ci; r1 = 42 ;
//
错误,r1 为常量
int &r2 = ci; //错误,ci为 常量,试图用一个非常量引用指向一个常量引用
初始化和对const的引用
引用的类型必须和其所引用的类型一致。但是有两个例外。???
int i = 42;
const int &r1 = i; //允许将const int& 绑定到一个普通 int 对象上 const int &r2 = 42; // r2 是一个常量的引用 const int &r3 = r1*2; // r3是一个常量的引用 int &r4 = r1*2; //错误,r4 是一个普通非常量的引用
说明:允许为一个常量引用绑定非常量的对象,字面值,或者表达式。
//
double dval = 3.14; const int &ri = dval;
cout< cout< 说明:ri引用了一个整形的数,对ri的操作应该是整形操作运算,单是dval却是双精度浮点数。中间生成临时变量3,就是对3的常量引用。当通过这个引用改变dval的值时就无法改变,这种引用非法。 2.4.2 指针和const 坚持就是胜利,每天写一点,每天都有一点进步,加油!!! 指向常量的指针------不能更改其所指的对象 // // const double pi = 3.14; // pi 为一个常量 double *ptr = π //错误,ptr 为 一个普通的指针 (所谓类型一致) const double *cptr = π //cptr 可以指向一个双精度的常量 的指针 *cptr = 42; //错误,不能给 *cptr 赋值 说明:指针的类型必须和所指的类型一致。有两个特列,一种特列情况是:允许另一个指向常量的指针指向一个非常量的对象。 double dval = 3.14; cptr = &dval; 另一种:指向常量的指针也没有也没有规定其所指的对象必须是一个常量。 Const指针 常量指针必须初始化,一但初始化,它里面存放指针的地址就不会改变,一直指向一个对象。 int Num = 0; int *const p = &Num; // p 一直指向 Num (顶层const) cosnt double pi = 3.14; const double *const pip = π // pip 是一个指向常量对象的常量指针 说明:指针本身是不是常量并不意味着不能通过指针修改其所指对象的值,能否这样做完全依赖于所指对象的值。 2.4.3 顶层const(需要看P59页) 顶层const(top-level const):指针本身是个常量。 底层const(low-level const):指针所指的对象是一个常量 坚持就是胜利,每天写一点,每天都有一点进步,加油!!! int i = 0; int *const p1 = &i;//不能更改p1的值,p1一直指向i(顶层cosnt) cosnt int ci = 42; //不能更改ci,(顶层cosnt) const int *p2 = &ci;//允许改变p2的指向,(底层const) const int *const p3 = p2;// 靠右的为(顶层const),靠左的为(底层cosnt) const int &r = ci;//用于声明引用的都是底层const 当指向拷贝操作,顶层不受影响 底层受到限制 2.4.4 constexpr 和 常量表达式 常量表达式:在编译过程中就能的计算结果的表达式(字面值,cosnt); Constexpr-----C11规定,允许将变量声明为cosntexpr类型以便由编译器来验证变量的值是不是一个表达式。 注意:声明为cosntexpr的变量一定是个常量,必须使用常量表达式初始化。 constexpr int f = 20; //20 是常量表达式 constexpr int limit = mf + 1; //mf+1是常量表达式 constexpr int sz = size(); //只有当size是一个consexpr函数时才是一个正确的声明语句 指针和constexpr---------------在constexpr声明中如果定义一个指针,限定符constexpr仅仅对指针有效,与指针所指的对象无关: const int *p = nullptr; constexpr int *q = nullptr; 说明:p是一个指向常量的指针,而q是一个常量指针,其中关键在与constexpr把它定义的对象设置为顶层cosnt. 坚持就是胜利,每天写一点,每天都有一点进步,加油!!! 与其他常量指针类似,constxepr 指针既可以指向常量也可以指向一个非常量。 2.5 处理类型别名 两种方法; 传统方法:typedef typedef double wages; typedef wages base,*p; 新标准:使用别名声明(alias declaration) using Si = Sqles_item; 指针.常量和类型别名(这里需要多看,才能理解) 如果某个类型别名指代的是复合类型或者常量,那么把它用到声明语句就会产生意想不到的结果。 typedef char *pstring ; const pstring cstr = 0; const pstring *ps; 说明:两条声明语句的基本类型都是const pstring,const 是对给定类型的修饰。Pstring实际上是指向char 的指针,因此,const pstring 就是指向char的常量指针,而非指向常量字符的指针。 const char *cstr = 0; //是对 const pstring cstr 的错误理解 强调:这种理解错误。声明语句中用到pstring时,其基本数据类型是指针。可是用char*重写了声明语句后,数据类型就成了char,*成了声明符的一部分。 这样改写的结果是,const char成了基本数据类型。前后两种结果截然不同,前者生命了一个指向char的常量指针,改写后的形式则声明了一个指向const 坚持就是胜利,每天写一点,每天都有一点进步,加油!!! char的指针。 int i =0; int * const p1 = &i;//这是常量指针,常量指针必须本初始化,始终指向一个对象的地址, (有点像引用) 针 来修改变量的值 const int j = 0; const int *const p2 = &i;//指向常量对象的常量指针可以指向普通变量,但也必须初始化 const int *const p3 = &j; //p3是一个指向常量对象的常量指针,只要是常量指针必须被 初始化 // // //可以通过常量指针修改变量的值,但是不可以令常量指针再指向其他对象 //p2 = &j; //这样就是错误的 const int *p4;//指针常量,可以不必初始化 ,可以指向多个对象 p4 = &i; p4 = &j; *p4 = 5; //这就是错误的,不能通过指 const text p5 = 0; //错误 , 如果只是简单的认为 把 text 替换成 int *,那就打 错特错了, const int *p5 ; //正确 ,如果只是简单的认为 坚持就是胜利,每天写一点,每天都有一点进步,加油!!! 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库C++ Primer学习笔记(2)在线全文阅读。
相关推荐: