- A+
辨别const类型指针
第一种:指针P指向的对象是const
第二种:指针P指向的对象是const
第三种:指针P是const
注意:识别的要点是看const的位置,const在*后面,指针为const;const在*前面,指针指向的对象为const。
指针P指向的对象是const,意思为不能通过该指针来修改该对象的值,而不是该对象是const
字符串常量和const
这种写法会报错,程序会将hello world字符串当成字符串常量,该字符串在内存中将以常量的形式存在,不可更改,而使用char *s指向该字符串内存,便可以通过该指针去修改该字符串常量,因此,这句代码会warning。而后面对s[0]的修改将会直接导致程序崩溃,因为它修改了常量。可以采用char const *s来避免这种问题。
如果需要修改hello world,可以采用下面这种方式。该方式将hello world拷贝到s数组中,这时的s是可写变量。
函数传参和const
Void f(const int* x)
传给函数的是指针,但是在函数体内部不会对指针指向的变量做修改。
Void f(const int x)
传给函数的是变量,但是保证在函数体内部不会修改该变量的值
上面两个的区别是:第一种是传址方式,使用指针传参可以避免大量的数据复制;而第二种会在传参过程中进行大量的复制操作,因为这是传值方式。
1表示:将函数返回值赋给一个const变量,j不可修改
2表示:函数返回值为const,用这个const结果赋值给变量k,当然没问题,因为并没有试图去改变f4函数的返回结果,返回结果是const(不可更改)。
const对象
在使用C++语言开发中,如果我们希望某一个对象在定义之后不被错误的修改,我们可以将这个对象声明为const对象,这样这个对象的数据成员就不可以被更改。
可以使用以下两种方式定义const对象
- const 类名 对象名;
- 类名 const 对象名;
1)定义类对象时可以将其指定为const对象。定义后const对象不能再被修改;
2)const对象不能调用非const类型的成员函数。
const成员函数
任何不会修改数据成员(即函数中的变量)的函数都应该声明为const 类型。我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。
结果:输出“f() const”
这种写法没问题,两个f()函数并没有重复定义,因为其实最后编译器会给每个函数都添加一个this参数,上面两个函数就变成了
因为a是const,所以a.f()会选择调用带const的f()函数去调用。
const成员函数特点:
- const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
- const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
- const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
- 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的