c++ primer学习笔记4_复合类型续

来源:互联网 发布:淘宝店技巧 编辑:程序博客网 时间:2024/05/18 21:08

j

2.3.2复合类型(续)

1.void*指针

Void*指针是一种特殊的指针,可用于存放任意对象的地址,虽然可以存放任意对象的地址,但是它到底是一个什么类型,我们并不知晓。比如:

double obj=3.14;double *pd=&obj;void *pv=&obj;pv=pd;


2.4 const限定符

如果希望定义一个变量,它的值不被改变。那么就要用const了。比如

const int bufsize=100;


这样就可以把bufsize定义为一个常量,任何想给bufsize赋值的行为都会引发错误。因为一旦const对象创建后其值就不能改变了,所以const对象必须初始化。比如

const int i=get_size();const int j=42;const int k;


在不改变const对象的操作中还有一种初始化,如果利用一个对象去初始化另外一种对象,那么是不是const都无关紧要。

默认情况下,const对象仅在文件内有效。如果想在多个文件中共享const对象,就必须在变量定义之前添加extern

2.4.1 const引用

可以把引用绑定在const对象上,称为对常量的引用。但是对常量的引用不能用作修改它所绑定的对象。如:

int i=42;const int ci=i;int j=ci;


2.4.1-1 初始化和对const的引用

前面说到,引用的类型必须与它所引用的对象类型一致,但是有2个例外。第一,在初始化常量引用时容许用任意表达式作为初始值。容许为一个常量引用绑定一个非常量的对象,字面值,甚至是一般表达式。比如

const int ci=1024;const int &rl=ci;rl=42;//cl是一个对常量的引用; int &r2=ci;//错误,试图用一个非常量引用指向一个常量对象


2.4.2const和指针

指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。注意,指针的类型必须与其所指对象的类型保持一致。但是有两个例外。

第一,容许另一个指向常量的指针指向一个非常量对象。比如

int i=42;const int &rl=i;const int &r2=42;const int &r3=rl*2;int &r4=rl*2;//错误,r4是一个普通非常量引用。


与常量引用一样,指向常量的指针没有规定其所指对象必须是常量。所谓指向常量的指针仅仅要求不能通过指针改变对象的值。

Const指针

指针是对象而引用不是,容许把指针本身定为常量,常量指针必须初始化。一旦初始化完成,它的值就不能再变了。把*放在const之前用来说明指针是一个常量。说明不变的是指针本身的值,而不是他指向的对象。如:

const double pi=3.14;double *ptr=π//错误,ptr是一个普通指针,不能指向常量对象。const double *cptr=π//正确,常量指针可以指向常量对象。 *cptr=42; //错误,常量对象不能被修改。。


2.4.2-2 顶层const

顶层const表示指针本身是一个常量,而底层const表示指针所指的对象是一个常量。顶层const可以表示任意对象是常量。注意,用于声明引用的const都是底层const。拷入和烤出的对象是否为常量都没什么影响。另外,底层const的限制不容忽视,在执行拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格。或两个数据类型能够互相转化。一般来说,非常量可以转化为常量,反之,no

2.4.4 constexpr和常量表达式

常量表达式是指值不会改变并且在编译过程中就能得到运算结果的表达式。字面值属于常量表达式。


0 0