区分const修饰的量是否能改,简单来说,主要看const后跟的那个量,该量是不能修改的。
1、const修饰变量
const修饰变量,可以使变量具有常属性,也就是该变量在以后的使用中其值都不能进行改变。
注意:const修饰的变量要进行初始化。
const a=11;
a=2;//错误,const 后面的a不能修改
2.const和指针
const 修饰指针变量有以下三种情况。
(1):const 修饰指针指向的内容,则内容为不可变量。
(2):const 修饰指针,则指针为不可变量。
(3):const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
(4)不能把有常属性的赋给无常属性的,如:
int i=88;
const int*p=&i;
int*q=&i;
p=q;//正确
q=p;//错误
3.修饰函数
(1).限定函数的传递值参数:
void function(const int Var); //传递过来的参数在函数内不可以改变.
(2).限定函数返回值型.
const int function(); //此时const无意义
const myclassname function(); //函数返回自定义类型myclassname.
.
3.const修饰类成员函数
(1)常成员函数声明格式:
类型说明符 函数名(参数表)const;
void print()const; //常成员函数, Const成员函数不能改变对象的成员函数。此时const修饰隐含形参this.
(2)const可以修饰类成员函数,防止类成员函数中除了static成员之外的其他成员被修改。
class A:
{
public:
void fun()const
{
a=20; //错误,不可以修改非static得值
b=10;
}
private:
int a ;
static int b;
};
(3)const关键字可以用于对重载函数的区分,如:
void getX(); //参数为:point*this
void getY() const; //const修饰隐含的形参this指针 //参数为:const point*this
同名不同参为重载。
4.const修饰类的成员变量
类的成员变量可以分为静态的和非静态的,如果const修饰的是非静态的成员变量,可以在构造函数中对该变量进行初始化;
如果const修饰的静态的成员变量,则需要在类外对该变量进行初始化。
class A
{
public :
A():a(10)
{}
private:
const int a;
static const int b;
};
const int A ::b=15;
5.const和#define的区别
#define A 10
const int A=10;
上面两条语句的作用是一样的,但是后面一条语句可以节省内存空间,这是为什么呢?
原因在于在程序中多次使用const类型的变量,只会在第一次分配内存,但是如果使用#define定义的宏,则每次都会分配内存,这样看来使用const会节省很多空间。
8、const和extern
file1.cpp中, const int a;
file2.cpp中, extern int a; //错误,无法调用,
说明const修饰大的变量只能在该程序的本文件中使用,不能在该程序的其他文件中使用。
要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为
extern const int a;