C++ primer读书笔记(二)

前言

经过一下午的艰苦奋斗,终于把这个书的第二章看完了。看完之后的感受就是明明这些东西都很简单就是非要弄一个const进来,完全就是一个搅屎棍啊。但是这里也开始逐步引入面向对象编程的思想了,其实在C语言也有一部分面向对象的思想在里面,就是结构体。只不过在C语言中的结构体里面只包含了数据,没有包含方法。其它的废话也不多说,前面比较简答的2.1,2.2也就忽略了,可以自己下去看一下很简单。我想在这里写出来是复合类型,就是那个加了const搅屎棍的东西

复合类型

复合类型比较多,我们下面一个一个的来介绍。

引用

引用(reference)其实就是我们小的时候经常被别人叫的外号,二狗子。在你那个村里或者小区里面,别人只要叫二狗子,就知道是叫的你。其实引用也是一样,就是为对象起一个别名。
今天我们就让这个二狗子来帮助我们理解这复合类型。

int ival = 1024;
int &refval = ival;
int &errval;//这个时候系统会报错

就像你在你们村里被别人第一次取外号的时候,肯定是那个谁谁外号加二狗子。这样别人才能通过二狗子找到你。相应的在程序中对于引用必须初始化也是理所应当的。
本来的外号是二狗子,不可能为二狗子这个名字再取一个三娃子的外号吧。这也是在C++中不允许定义引用的引用因为引用不是对象。
引用的内容比较少,下面我们来看一下他的异父异母的兄弟——指针

指针

指针就像二狗子的位置,吃过午饭你想去找二狗子玩,那么就按着二狗子家的地址到了他家,发现二狗子在家。那么这个时候就是一重指针;二狗子不在家,他爸爸在家告诉你二狗子去他奶奶家了,然后告诉你他奶奶家的地址,你又去他奶奶家找二狗子了,这就是二重指针。
下面我们来看一下C++中对于指针的定义。

int i = 1;
int *pi = &i;//这个&符号是对i对象进行取地址操作

通常情况下我们都要求指针类型和他所指向的对象严格匹配,因此在上一部分中我们讲过,引用不是对象,所以不允许定义指向引用的指针。通常我们指针的值都应该属于下列4种情况:

  1. 指向一个对象
    int i = 1;
    int *pi = &i;
    
  2. 指向对象空间的下一个位置
  3. 空指针
  4. 其它情况,这个情况我也不是很清楚。

既然可以通过指针指向对象,那么我们也可以使用指针操作对象

*pi = 0;

建议所有的指针都要进行初始化

特殊的指针

void*指针可用于存放任意对象的地址,但是相应的也有他的局限,不然所有的指针都可以用这个指针定义,为什么还要保留那么多指针类型。他的局限在于不能操作所指的内存中的对象。
另外还有一个就是指向指针的指针,就是我们前面说到的去二狗子奶奶家找二狗子的例子。

int i = 0;			//初始对象
int *pi = &i;		//一重指针
int **ppi = π	//二重指针

前面的内容都很简单下面开始这一章的重点了,const搅屎棍。

const限定符

const的作用就是定义一种不能改变的变量,常量。但是由于他不能改变所以在定义的时候必须对其进行初始化,就如同下面一样。

扫描二维码关注公众号,回复: 9035472 查看本文章
const int bufsize = 512;//确定输入块的大小,而且在后面的使用中也不会改变了。

const修饰的变量和其它变量一样都是只能在文件内有效,如果要使其的作用范围扩大到其它文件的话,必须使用extern关键字。
上面就是const基础部分的内容,下面要将const和应用以及指针结合起来,这个时候就会变得复杂很多,让我们来看看吧。

const的引用

我们直接总结结论:

  1. 不允许:非常量引用引用常量变量
  2. 允许:常量引用引用非常量变量,但是不能从常量引用处对非常量变量进行修改,但不妨碍通过其他方式修改非常量变量。

下面我们就来看一个例子:

//常量引用非常量
int i = 42;
const int &ri = i;
//非常量引用常量
const int t = 42;
int &rt = t;//这种方式是错误的

关于const和引用这一部分的内容还相对比较简单,下面就来看看两个恶心的东西混到一起是什么东西。

指针和const

和前面引用一样的,我们先对这一部分进行一个总结。

  1. 允许:指向常量的指针指向非常量对象
  2. 不允许:指向非常量的指针指向常量对象

另外还需要区分的一个东西是,指向常量的指针和常量指针

  1. 指向常量的指针:const int * px;这个是指针是指向常量
  2. 常量指针:int *const px;,这个是指针是常量,含义就是指向的地址是恒定不能改变的。

区分完这两个概念之后紧接着来的就是关于顶层const和底层const,

  • 顶层const:表示指针本身是个常量,常量指针;
  • 底层const:表示所指对象是一个常量,指向常量的指针。

处理类型

typedef

使用C语言遗留下来的typedef可以实现对类型进行别名操作。

typedef double wages;//wages是double的同义词

using

这是C++11中引入的一种新方法,进行别名声明。

using SI = Sales_item;//SI是Sales_item的同义词

auto

这也是C++11全新引入的类型说明符。

auto item = val1 + val2;//item根据val1和val2相加的结构判断类型

由于类型由赋值的对象判定,所以auto定义的变量必须有初始值。

decltype

*p = &i;

这里面的难点就是decltype(*p)的类型,大家可能认为应该是int。但是实际上这是一个引用类型,int&
为什么呢?
首先我们对于*p是不是可以对p所指的对象进行读取和操作,然后这和直接对p所指的对象使用引用完全没有区别啊。所以这个时候系统就判定 *p是作为引用存在的。这也是我觉得这部分最难理解的地方。

总结

虽然一下午看起来很枯燥但是看完之后回顾一下还是感觉十分充实的。相信后面的内容会更加丰富和有趣(想啥呢)。那我们加油吧。准备迎接字符串,数组,向量的打击吧!

发布了7 篇原创文章 · 获赞 5 · 访问量 985

猜你喜欢

转载自blog.csdn.net/deng821776892/article/details/101380861
今日推荐