C中的const
C语言中的const可以用来修饰变量,用const修饰的变量为常变量,本质还是变量,只不过具有常属性。
#include<stdio.h>
int main()
{
const int a = 10;
int arr[a] = {0};//报错,数组[]内的表达式应为常量值
return 0;
}
经过const修饰变量的内容不允许被修改,但是可以通过指针的方式修改其内容。
const 可以用来修饰指针变量,也可以用来修饰指针(常用来修饰函数形参)。
#include<stdio.h>
int main()
{
int a = 10;
int b = 30;
const int* pa = 10;//表明pa指向的空间内的内容不能被修改;
//*pa = 20;//报错
pa = &b;//但是可以通过改变pa的指向达到修改pa指向空间内内容的目的
printf("%d\n", *pa);
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;
int b = 30;
int* const pa = 10;//表明pa的指向不能被修改
*pa = 20;//pa指向空间的内容可以被修改
//pa = &b;//报错
printf("%d\n", *pa);
return 0;
}
const放在*的左边,表示指针指向空间里的内容不能被修改,但是指针的指向可以被改变
const放在*的右边,表示指针的指向不能被改变,但是指针指向的空间里的内容可以被修改
const同时加在*的两边,表示指针的指向和指针指向的空间里的内容都不能被修改。
可以用来修饰函数的返回值
当返回值为指针时,有意义,一般数值没有意义
当返回值为const指针时,表示对返回指针所指向的数据内容不要进行修改。有修改则程序会报错!(C中只是警告,C++中会报错)
C++中的const
C++为了兼容C,C的const作用C++都有,但是还有一些区别。
C++中的const修饰变量,使变量成为常量。
C++中的const可以修饰成员函数
#include<iostream>
using namespace std;
class Date
{
public:
Date(int day=10)
:_day(day)
{}
const void Change_day(int newday) const //修饰this指针,表示this指针指向的
//内容不能被修改
{
_day = newday;//会报错误
}
void Print()
{
cout << "day:" << _day << endl;
}
private:
int _day;
};
int main()
{
Date d;
d.Change_day(20);
d.Print();
return 0;
}
在成员函数的后面加上const,表示this指针指向的内容在函数体内不能被修改,如果要修改,则不能加const。
使用const函数注意的几点:
a.const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
b.非const成员函数可以调用const修饰的成员函数,而const成员函数不可以调用非const成员函数。
c.const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
d.const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
e.然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
f.const关键字不能与static关键字同时使用,因为static关键字修饰成员函数为静态成员函数,静态成员函数是所有对象共有的,不含有this指针,所以const不能修饰static函数。
问:const能修饰类的构造函数吗?
答:const不能修饰构造函数。
原因:类的构造函数是构造对象并进行初始化的,在构造没完成之前对象不存在,没有对象就没有隐含的this指针,const修饰成员函数是修饰this指针的,所以不能修饰构造函数。还有一点是不一定所有的初始化全部在构造函数的成员初始化表中完成,有可能也在构造函数体中初始化,如果const可以修饰构造函数,那么就不允许初始化(修改成员变量的值),所以不能修饰构造函数。
问:const能修饰类的析构函数吗?
答:const不能修饰析构函数。
原因:类的析构函数的主要功能是在对象销毁时自动调用析构函数来进行资源的释放,或关闭文件等,const修饰成员函数是修饰this指针的,我们知道this指针的类型是T* const this,表明不允许修改this指针的指向,但是析构函数要释放资源,销毁对象,this指针表示当前对象,析构时肯定会改变this指针的指向, 所以const不能修饰析构函数。
问:const能修饰静态成员函数吗?
答:const不能修静态成员函数。
原因:static关键字修饰成员函数,表示成员函数不再是属于某个对象,而是整个类共有的,所有静态成员函数没有this指针,所以const不能修静态成员函数。