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

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

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

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

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

如:

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

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

关于const引用:

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

实际上,这种形式正式下面要讲的顶层const,约定指向对象时const,它是可以直接用常数为引用赋值,注意对比上面的。

这也正是为什么可以为顶层const的函数参数传递常数的原因。

const int &a=;
double b = 1.22;
const int &c=b;
const int &d = *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;指约束自己,指针本身是常量。

顶层const和底层const:

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

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

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

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

关于顶层const的拷贝,举例子:

int i = ;
const int c = ;
i = c;

c是一个顶层const,因为它本身就是不可改变的对象,这种值拷贝并不在乎c是否为const。

关于底层const的拷贝,也举个例子:

const int *b = ;
int *p = b; //错误的

这种情况下是错误的,底层const的拷出是严格的,b已经约定了它指向的对象是不会被改变的,而p变量本身没有这种约定,b是不放心的。也就是说底层const在拷出的时候是严格的,双方都应该是底层const。但是对于底层const,拷入确实可以的:

int i = ;
const *p = &i;

这是可以的,普通的int *可以转换成const int*。

const形参和实参:

实际上,顶层const作为形参是会被编译器忽略掉的,什么意思,我们看个例子:

void fun(const int a);
void fun(int a);

看这两种函数声明,我们以为很开心的重载了,但是最后确报错了,实际上,忽略了顶层const,这两种声明是完全一样的。

我们可以对比这一种情况,如果还分不清底层或者顶层const的话:

void fun(const int& a);
void fun(int &a);

尽量使用常量引用:

实际上,在前面已经提到过:

int a = ;
int &b = a;
//我们可以这么用
/但不可以这么用
int &c = ; //不可以
//但可以这么用
const int &d = ;

要是是这样一个函数:

void fun(int &a);

如果这么调用:

fun();

会报错。

但是如果是这样的声明:

void fun(const int &a);

就不会报错了。

c++学习总结--复合类型,const。的更多相关文章

  1. c语言基础学习09_复合类型

    =============================================================================涉及到的知识点有:一.结构体1.定义结构体st ...

  2. C++学习——C++复合类型

    1.引用 引用是为某一个变量起了另一个名字,定义方式为type &rval = val; 引用类型必须与引用的变量类型完全一致,引用后,rval和val将会被视为一个变量,只不过有两种调用方式 ...

  3. C++ Primer Plus 第四章 复合类型 学习笔记

    第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...

  4. 学习C++.Primer.Plus 4 复合类型

    本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...

  5. 变量和基本类型——复合类型,const限定符,处理类型

    一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...

  6. oracle学习 十一 包+复合类型+自定义异常(持续更新)

    在这里讲一下包的概念, 二话不说上个例子 包头: create or replace package pck_test is procedure proc_report_salary(name nva ...

  7. es6学习笔记--let和const

    今天学习了es6中的let和const命令,借此整理一下笔记. let : let 和 var 的声明方式一样,但有 var 比不上的优点.下面用 var 和 let 的例子来加深对 let 的理解. ...

  8. 第54讲:Scala中复合类型实战详解

    今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...

  9. C语言中的复合类型

    复合类型 一.掌握的类型 1. 指针数组 int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组 int a,b,c,d; arr[0] = & ...

随机推荐

  1. 封装upload文件上传类

    <?php //封装php中的单文件(图片)上传类 /*  //参数1:$file 文件数组  5个属性值 name,type,size,tmp,error   //参数2:文件保存的路径$pa ...

  2. URAL 1139 City Blocks(数论)

    The blocks in the city of Fishburg are of square form. N avenues running south to north and Mstreets ...

  3. JSon_零基础_005_将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写:po(bean)代码: package com.west.webcourse.po; /** * 第 ...

  4. 夺命雷公狗---node.js---21之项目的构建在node+express+mongo的博客项目6之数据的遍历

    首先还是来链接数据库,然后就查找,如下所示: /** * Created by leigood on 2016/8/31. */ var express = require('express'); v ...

  5. MySQL增删改查

    C/S:Client ServerB/S:Brower Server php主要实现B/S .net IIS java TomCat LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Ph ...

  6. IO细述

    Java IO1:IO和File IO 大多数的应用程序都要与外部设备进行数据交换,最常见的外部设备包含磁盘和网络.IO就是指应用程序对这些设备的数据输入与输出,Java语言定义了许多类专门负责各种方 ...

  7. 前端控制器DispatcherServlet 详解

    DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...

  8. 解决Android SDK Manager更新下载速度慢

    1.在Host文件加上 203.208.46.146 www.google.com 74.125.113.121 developer.android.com 203.208.46.146 dl.goo ...

  9. XAMPP和Bugfree详细教程

    一.XAMPP安装配置 xampp是一款跨平台的集成 apache + mysql + php环境,是的配置AMP服务器变得简单轻松,支持windows,solaris, 下载地址:http://so ...

  10. Android侧滑

    人人客户端有一个特效还是挺吸引人的,在主界面手指向右滑动,就可以将菜单展示出来,而主界面会被隐藏大部分,但是仍有左侧的一小部分同菜单一起展示. 据说人人客户端的这个特效是从facebook客户端模仿来 ...