设为首页 加入收藏

TOP

C++ Primer 详解(第二章)(二)
2017-10-13 10:22:08 】 浏览:523
Tags:Primer 详解 第二章
理想的,他便保留原文不译,其中reference便是其中一个。在一些其他书里面,reference被翻译为别名。争议存在就肯定有其道理,因此不要按照中文的引用的原意去理解这个类型~。

2.定义一个引用类型:一个类型说明符+&声明符,并被初始化。

3.由于引用类型是默认const类型的,而const类型在定义的时候必须初始化,且不可被“赋值”(严格的说这样的说法是错误的因为引用不是对象,但是可以这样理解)。

4.引用类型是只是并非一个Object,它只是一个名字,它的定义不会被分配内存,自身没有地址,它仅仅是其他对象的“绰号”。

5.由于第3点的原因,不能定义一个引用的引用类型。(引用的实现和指针相关,它没有地址,所以不能被引用)。

6.一定得注意的:除了一些特殊的情况,所有的引用类型必须都必须和与之绑定的对象类型严格匹配。不然同一个对象会拥有两种类型。

2)指针

1.指针(pointer,point to)是用来实现对一个对象的另外一种访问方式。

2.不要混合指针和引用。指针是一个对象,它自己也有地址,不是默认const类型。

3.定义一个指针类型:一个类型说明符+*声明符,并被初始化。

4.注意:声明符必须放在每个变量前面。

5.P47页(中文版)有句话:因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。读到这句话的时候,想了下,指向引用的指针不是应该会被指向被引用的对象么。为什么不可以,在VS上进行实验,也能运行。难道书上错了或者是编译器优化?后来,细细解读指向引用的指针:

[cpp] view plain copy

char &*pStr=pStrCout  

这才是指向引用的指针类型.

6.前面提到过,定义个指针或者内置类型的变量的时候,最好赋一个初始值。给指针赋没有确定的情况下最好赋为空。 0,NULL,nullptr.

3)理解复合类型的声明

1.最重要的:变量的声明为一个类型说明符+一组声名符,声明符为一组并且可以相互修饰,例如上面的char &*,int *&.这种,记住一个原则:往往越靠近变量的声明符对变量的影响越大(从右到左)比如char &*,首先它是一个char类型的指针这个指针指向的是一个引用。

int *&首先它是一个int类型的引用,这个引用引用的对象是一个指针。

2.4 const限定符

1.记住const与非const是两种不同的类型,很多成员函数可以因为是否有const特性而重载,而很多人却忽略了这个事实。

1)const引用

1.const限定符只是告诉编译器这个变量的值是不能被write,只要是不修改它的值,其他的任何操作都是正确的。

2.const对象,由于被定义后值不能再被改变,因此在定义的时候必须初始化。

3.如果想在多个文件中共享const对象,必须在变量定义之前添加extern。

4.const对象分为编译时常量和定义时常量,这两种常量有一定的区别,比如数组定义的时候,要定义一个定义时常量。

5.给一个普通引用,指针赋值的时候,等号右边不能是一个常量对象.记住,。(其实不止是不能是一个常量,由于指针的特殊性,给指针赋值的时候,一定要考虑好这个值是不是真的能赋值给这个指针)

6.const的特殊性:前面提到,一个引用引用的类型必须是一个对象。但是对于一个const引用是一个例外。比如想要获得一个对象的内容为42的对象的引用。我们正常的代码是int uVal=42;int &rVal=uVal;但是由于const的特殊性,编译器会帮我们做这个优化,我们可以直接这样定义:const int  &rVal=42;道理同样,编译起帮我做了int uVal=42这一步,问题来了,为什么const可以这样做,其他非const对象不能这样写。再看一个例子:double dVal=42.423;想要定义一个引用引用这个dVal,但是由于某些原因,这个引用需要是int类型的,我们会这样做:int uTemp=dVal; int &rVal=uTempl;在int uTemp=dVal发生了隐式转换,然后再赋值给这个int类型的引用,同上,对于const 对象,我们可以直接const int &rVal=dVal;编译器会帮我做上面的步骤,因为我们保证了dVal是不会改变的,如果改变rVal,但是rVal引用的实际是uTemp,dVal并没有改变。所以必须是const。

7.深入理解引用:可以通过引用看到赋值和初始化的区别:给一个非常量引用初始化的时候,类型必须严格一致,但是给在赋值的时候却可以发生类型转换。例如:

int i=0, &r1=i;  

double d=0,&r2=d;  

可以这样:r1=r2;r1=4.32;都不会发生错误。但是int &i=d;就会报错,这就是初始化和赋值的区别。

2)指针与const

1.指向常量的指针:一个指针指向一个常量对象:const double pi=3.14;那么这个指针的定义:const double *ptr=π(还是按照前面所说的:离变量越近的声明符对变量影响越大:首先这是一个double类型的指针,这个指针指向的时一个常量)(指向常量的指针可以指向非常量对象)

2.常量指针:常量指针是说的一个指针,这个指针是一个常量。类似引用那样:double *const ptr=π(理解:ptr是一个常量,它的值不可以改变,这个常量是一double型的指针)。

3.如上说的,常量指针是一有类似引用的属性,它定义的时候必须初始化。

4.指向常量的指针和常量指针区别:

指向常量的指针所指向的对象是一个常量。*ptr不能改变,但是指针所指向的对象ptr能改变

常量指针是指针本身是一个常量,指针只能一直指向这个对象,不能改变,但是所指向的对象的值可以改变。

3)顶层const

1.顶层const:对象本身是常量,底层const:所指对象是const(一般用于指指针或者引用)
2.顶层const比较随意,并且赋值和被赋值都没有要求,但是底层const必须注意:当等号左边是一个非底层const的时候,等号右边不能是一个非const对象,而当左边是一个底层const对象的时候,右边可以随意.

举例:const int c=1;   const int &r=c; //正确   int &rc=c;//错误 

4)constexpr表达式(目前好像还是有些编译器不支持此关键字)

1.constexpr定义:[C++11] ①值不会改变 ②编译过程常量 

2.constexpr和const的区别:const 是指这个值是不会被改变的。而且分为编译时常量和运行时常量而constexpr是指在编译期期间就可以确定的常量,简单的说就是比const还const的常量,

3.constexpr可以用来修饰函数。例如{return 42;}这种函数,但是编译器并不负责检查这个con

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇支持多进程读取同一个目录 下一篇java数据类型

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目