C++ 语法--唯一的难点const和复合类型

总结在底下。

1.const和引用

可以把引用绑定在常量上,称之为,对常量的引用。不能对那个引用赋值。

如:

const int ci = 1024;

const int &ri = ci;

解读:ri是对ci的引用。ri的const意思是视ci为变量。

对于常量,只能使用“对常量的引用”这个引用方式 int &ri = ci;是错误的,因为ci不能赋值,但是可能会对ri赋值从而影响const限定。

所以,他们(制定标准的人)创造了 对常量的引用 的 引用方式。

下面高能!!!

上面说:

视ci为变量

为什么?

2.对常量的引用方式引用变量

int i =2048;

const &ri = i;

解读:ri 把 i 视为变量,然后引用它

效果:不能对ri赋值,但是可以对i赋值。这里i是变量。

所以:“对常量的引用” 是一种引用|方式|! 对于真正的常量,必须使用这种方式,对于变量,这种方式使代码不得通过引用来赋值。

这么想:你想开放一个对象,别人只能读取,但你可以修改这个对象的值。

int i;   //你的对象

const int &ri = i;   //把这个传出去

对常量引用可以绑定:常量,变量。。。字面值,表达式!!!

int i = 5;

const int &ri1 = i; //const int& 绑定到 int 变量

const int &ri2 = 9;  //正确:对常量引用可以

const int &ri3 = r1 * 2; //正确:反正ri是对常量的引用

int &r4 = r1 * 2;  //错误:普通引用就认命吧

r3绑定的是当时对这个表达式的求值得结果,是一个临时量。

引用和const的那些事就完了。

噩梦,复合类型还有一个,指针

3.指针和const

好消息:指针和引用差不多。

于是:

指向常量的指针

const int i = 2;

const int *pci = &i;

很像吧,一样,对于常量,必须使用指向常量的指针。

现在指向变量:

int ii = 2;

const int *pci = ⅈ

同样,解引用pci后不能赋值,但是可以直接对ii赋值。

大菜来了!!!

4.const指针

复习:指针是对象,而引用不是。

const指针 就是说:指针对象本身是常量,允许把指针本身定义为对象。

效果:const指针不能更改指向对象的地址。

人话:1.必须初始化2.只能指向一处。

把*放在const关键字的前面,就说明指针本身是常量。

int i = 0;  //管你的想指变量还是常量

int *const cpi = &i;  //将一直指向 i ;

大招:

指向常量的指针 和 常量指针是分开的.

const int *const cpci = &i;

分析:指向常量的常量指针。

性质:1.必须初始化(来自常量指针的属性)

   2.指向是不会再变了(来自常量指针的属性)

   3.既可以指常量,也可以指变量(来自指向常量的指针的属性)

5.解脱

上面的定义太绕口了。好爽,这就是为什么C++难了。

定义:

拿指针做示例

顶层const:表示指针本身是常量

底层const:表示指针指向的对象是常量(或者看作是常量)

推理:

1.引用没有顶层const,引用不是对象,只是绑定。

2.简单基本类型的常量都是顶层的。

3.指针可以既是顶层const又是底层const

坑:不要忽视底层const

int i;

const int *pc = &i;

int * p = pc;  //错误,pc具有底层const

底层const使用示例:只读器

int i;

const int *ci = &i;  //把这个传出去,只读的呦。

关于定义怎么理解,个人看法:

const int                        |    *const p;

指向对象的基本数据类型|    声明符

表示指向常量                 | 表示指针本身是常量

底层const                      | 顶层const

注:笔者初二学完的,不信有人看不懂

时间: 2025-01-01 21:40:35

C++ 语法--唯一的难点const和复合类型的相关文章

谈谈javascript语法里一些难点问题(转)

谈谈javascript语法里一些难点问题(一) 1)    引子 前不久我建立的技术群里一位MM问了一个这样的问题,她贴出的代码如下所示: var a = 1; function hehe() { window.alert(a); var a = 2; window.alert(a); } hehe(); 执行结果如下所示: 第一个alert: 第二个alert: 这是一个令人诧异的结果,为什么第一个弹出框显示的是undefined,而不是1呢?这种疑惑的原理我描述如下: 一个页面里直接定义在

ES6语法:let和const

ES6新增加了两个重要的JavaScript关键字:let和const 一.let关键字 let声明的变量只在let命令所在的代码块内有效. 1.基本语法 let a='123' 2.let和var的区别 var也是用来声明变量,let和var有什么区别呢?区别主要是以下三点: 2.1.同一作用域内let不能重复定义同一个名称,var可以重复定义 看下面的例子: // 同一个作用域内let不能重复定义同一个名称 let a='123';let a='456'; // 错误 // var可以重复定

谈谈javascript语法里一些难点问题(一)

谈谈javascript语法里一些难点问题(一) http://www.cnblogs.com/sharpxiajun/p/4133462.html

c++学习笔记--复合类型,const。

复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复合类型,首先,它和指针不同的是它并不是一个对象,仅仅只是另一个对象的别名.而且,引用绑定的东西必须是一个对象,引用不是,所以定义引用的引用是 不合法的.也不能定义字面量的引用.同时,普通引用的绑定对象与引用定义类型必须相同. 如: int &a=10;//错误的,必能定义字面量 double b =

第四章 复合类型

第四章  复合类型 4.1  数组 4.1.1  数组简介 数组(array)是一种数据格式,能够存储多个同类型的值. 声明数组的通用格式如下: typeName arrayName[arraySize]; 表达式arraySize指定数组的元素数目,它只能是以下三种情况之一: 1)        整型常数(如10,枚举值也可以): 2)        const值 3)        常量表达式(如8 * sizeof(int)) 注意:使用数组要注意下标的正确.编译器不会检查使用的下标是否有

Go语言学习笔记(4)复合类型

  Go语言的复合类型,包括数组.切片和映射等. 值.指针和引用类型 通常情况下Go语言中的变量持有相应的值.也就是说,我们可以将一个变量想象成它所持有的值来使用.其中有些例外,通道.函数.方法.映射.切片是 引用变量,它们持有的都是引用,也即保存指针的变量.值在传递给函数或者方法的时候会被复制一次,对于布尔类型和数值类型来说这非常廉价,但是对于大型变 量代价却非常大.而且复制传参的方式,修改值只是修改了副本,这能保证原始变量不被修改,但也一定程度上增加了修改原始值的麻烦.幸好在Go语言中有指

C++Primer快速浏览笔记-复合类型

C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象,因此引用必须初始化. 定义引用时,程序把引用和它的初始值绑定到一起,而不是将初始值拷贝给引用. 引用本身不是一个对象,所以不能定义引用的引用 引用只能绑定在对象上,而不能与字面值或者某个表达式的结果绑定在一起. 引用的类型必须和与之绑定的对象的类型严格匹配.但是有两种例外情况: 1.初始化常量引用

C++ Primer Plus 复合类型

复合类型是指基于基本整型和浮点类类型而创建的数据格式. 1. 数组 1.1 声明数组时,必须指定元素数目,且元素数目必须是编译时已知的,所以变量(运行时设置的)不可以用来指定数目: 1.2 如果只对数组的一部分进行初始化,则编译器将其他元素设置为0; 所以初始化整个数组为0可以--int array[10] = {0}; 注: C++ 11支持去掉代码中的等号以及0,且不支持缩窄转换; 2. 字符串(C-风格字符串) 2.1 C++处理字符串有两种方式--C-风格字符串 & string类库;

JS面向对象之特性和值类型与复合类型

JS面向对象之特性已经值类型与复合类型 一些属性 空对象 空对象也是对象, 只是有存变量的变量名, 没有对象属性 var o = {}; 参数传递 值类型: 函数内外两个变量, 两个数据, 都不相同 引用类型: 函数内外变量不同, 一个数据, 相同地址 赋值 var num = 123; var num2 = num; 值类型的赋值特点 将变量内的数据全部拷贝一份, 赋值的变量 var num = 123 表示变量中存储中的数字是 123 将 123 数据拷贝一份, 内存中有 2 个数据 将拷贝