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

复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出。

首先,最常用两种复合类型应该是引用和指针。

所谓复合类型,是在基本类型基础(如:int)上定义的类型。

引用是c++的一个复合类型,首先,它和指针不同的是它并不是一个对象,仅仅只是另一个对象的别名。而且,引用绑定的东西必须是一个对象,引用不是,所以定义引用的引用是

不合法的。也不能定义字面量的引用。同时,普通引用的绑定对象与引用定义类型必须相同。

如:

int &a=10;//错误的,必能定义字面量
double b = 1.22;
int &c = b;//错误,必须是同一种类型。

虽然,普通的引用不能这么定义。

但是const引用却可以,这意味着,像下面这样的代码是合理的:

const &a=10;
double b = 1.22;
const int &c=b;
const int &d = 2*b;

为什么const可以呢?这样代码在编译过程中是这样的

例如第三个:

int tem = b;
const int &c=tem;

系统生成了临时对象。在c++primer中,作者给了这样一个解释,const的引用时不允许对const所修饰的对象进行改变,这意味着,无法改变const引用所绑定的对象,自然也

无法改变tem,但是普通的引用,我们肯定是希望改变引用所绑定的对象的,不然为什么要用引用,既然如此,如果这个规则在普通引用也试用,那改变的将是临时对象,这肯定是矛盾的。

指针是另外一种符合类型。

指针是对象,这个和引用是不同的,它绑定的是另外一个对象的地址。对未知地址的操作可能造成意想不到的效果。所以在指针并不知道指向哪里是,可以先指向NULL,或者c++新标准的nullptr。NULL是预处理变量,不属于std空间,可以直接用。

看这两种指针定义:int *p[3]和int (*p)[3],有什么不同呢。

int *p[3],强调了p[3]保存的是int *,也就是这是一个保存指针的数组,内存是三个int单元。

int (*p)[3],强调的是p是指针,它指向的是一个大小为三的int数组。这意味着p+1,是下一个大小为三的数组首地址,可以当成一个n行3列的二维数组来用。

const是一个限定符,表示常量。

被const限定的指针和引用,相当于签订了协议,表示这个指针或引用所对应的值将不会改变,然而所对应的值是否是常量并不要求,就好像我只约束我自己,你那边怎么样我不管。

这意味着普通的指针或者引用不能绑定常量地址,而指向的常量指针或引用这可以绑定普通地址。

指向常量的指针:如:const int  *a;指约束指向的地址值应该是常量。

还有一种是 常量指针:int const*a;指约束自己,指针本身是常量。

top-level const(顶层const):本身是const

low-leve const(底层const):指向对象是const

之所以这样分类是,因为,底层const约束自己不改变指向的值,所以在执行拷贝或拷出的时候,它要严格约定双方都是底层,不允许对方改变指向对象的值。

而顶层const则约束的是自己,也就是指针或者别的基本数据类型本身不被改变,这意味着,在拷入和拷出并不需要都是顶层const,因为这样的操作不会改变他自己。

时间: 2024-10-16 12:39:39

c++学习笔记--复合类型,const。的相关文章

C++学习笔记7,const关键字的使用(一)。

在C++里面,const关键字的用处很多,使用好const关键字对程序的健壮性大有好处. 首先来看看const一般都用在什么地方. 1.用于定义常量. const用的最多的就是用来定义常量了. const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误. 一个最简单的例子: #include <iostream> using namespace std; int main() { cons

C++学习笔记8,const在函数方面的使用(二)

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接

C# in Depth Third Edition 学习笔记-- 值类型和引用

I. C#中值类型和引用类型 1. 类class 引用类型,结构struct值类型 2. 数组是引用类型,即使元素是值类型,int[]是引用类型 3. 枚举是值类型enum 4. 委托类型delegate是引用类型 5. 接口类型interface是引用类型,但可以由值类型实现. II. 值的表达式:表达式“2+3”的值就是5:而对于引用类型的表达式,它的值是一个引用,而不是该引用所指代的对象,如String.Empty的值不是一个空字符串,而是对空字符串的一个引用. III. 变量的值在它声明

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

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

ES6学习笔记(let、const、变量的解构赋值、字符串扩展)

一.let命令 1.let命令所在的代码块内有效,var声明的在全局范围内都有效 2.for循环的计数器,就很合适使用let命令 3.let声明的内部变量i和外部变量i是分离的 4.var命令会发生"变量提升"现象,即变量可以在声明之前使用,值为undefined   let命令不会发生"变量提升"现象,它所声明的变量一定要在声明后使用,否则报错 5.let不允许在相同作用域内,重复声明同一个变量 6.let会导致暂时性死区,在代码块内,使用let命令声明变量之前,

C++学习笔记与思考 --const限定符及其引用,typedef符号

1. 定义const对象 因为常量在定义后就不能被修改,所以在定义时必须进行初始化. const int bufSize=512; const int i; // error; i is uninitialized const 2. const 对象默认为文件中的局部变量 我们知道,如果我们在一个文件中定义了一个非const变量,如果我们想在另一个文件中使用这个变量,只需要在使用前添加extern 声明即可. file1.cpp int counter; // file2.cpp extern

go语言学习四 - 复合类型字面量声明

package main import ( "encoding/json" "fmt" ) func main() { //go语言的复合大括号文面量声明非常强大和灵活 //只要在最外层声明完整的复合类型在大括号内部就不需要再声明类型而直接用大括号了 a := [][]int{ {1, 2, 3, 4}, //这里不必再用 []int{1,2,3,4} 声明,如果用的话编译器提示冗余的类型声明(Redundant type declaration) {5, 6, 7

Objective-C学习笔记 复合

才看到昨天的不知道为什么没有发出去... 第五章 复合 复合的定义:通过包含作为实例变量的对象指针实现.例如: @interface Unicycle : NSObject {           Pedal*pedal;           Tire*tire; }//Pedal和tire通过复合的方式组成了Unicycle 严格来说只有对象间的组合才叫做复合. 自定义NSLog()可以使用%@格式说明符来输出对象. 存取方法 存取方法是用来读取或改变某个对象属性的方法.如果添加一个新方法去改

【C++11学习笔记】类型判断的type_traits学习

一.简单的type_traits 我理解的type_traits是利用C++模板特性和static.enum特性定义编译器常量,例如 //std::integral_constant源码 typelate<class T, T v> struct integral_constant { static const T value = v; typedef T value_type; typedef integral_constant<T, v> type; operator valu