关于c++ const的使用

const的定义

Const是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的,即不能够改变。

c++中const的作用

(此图片转自https://blog.csdn.net/Eric_Jo/article/details/4138548)
关于c++ const的使用_第1张图片

c++和c中const的区别

在c++中,一个const不必创建内存空间,而在c中,一个const总是需要内存空间。

  • 在C语言中,const定义的局部常量是一个伪常量,编译器为它分配内存,通过指针可以访问,从而改变这个常量的值。

  • 在c++中。const编译是一个真正的常量,编译器不会为const分配内存,只会临时开辟一快内存空间。

  • 那如果在C++中定义const,如何为其创建内存空间。

    1、 取一个const地址

    2、 把他定义为extern 则会为const创建内存空间。

C++和C的相同点(代码)

当Const定义的是全局变量。
  • c语言中,const会被存储到只读数据段。c++中const,当声明extern或者对变量取地址时,编译器会分配存储地址,变量存储在只读数据段。两个都受到了只读数据段的保护,不可修改。

如图所示:
关于c++ const的使用_第2张图片
如这段代码,不能够修改constA的值,它的结果是:
在这里插入图片描述

C++与C的不同点(代码)

当Const定义为局部变量时。

在c语言中定义是,编译器会为其分配内存,通过指针可以改变这个量。
关于c++ const的使用_第3张图片
但是在C++中就不行。

  • C++中对于局部的const变量要区别对待:
  • 1、对于基础数据类型,也就是const int a=10这种,编译器会把它放到符号表中,不分配内存,当对其取地址时,会分配内存。
    关于c++ const的使用_第4张图片
    关于c++ const的使用_第5张图片

c++中const的一些分配内存的情况:

  • 1、对于基础数据类型,如果用一个变量初始化const变量。即const int a=b;那么也是会给a分配内存的。
    关于c++ const的使用_第6张图片

constA分配了内存,所以我们能修改constA的值。

  • 2、对于自定数据类型,比如类对象,那么也会分配内存。
    关于c++ const的使用_第7张图片

const的使用

  • 1、用于指针的两种情况:const是一个左结合的类型修饰符.

     int const *A;    //A可变,*A不可变
    
     int *const A;    //A不可变,*A可变
    

关于c++ const的使用_第8张图片

  • 2、限定函数的传递值参数:

    void function(const int Var); //传递过来的参数在函数内不可以改变.

  • 3、限定函数返回值型.

const放在函数前面的意义到底是什么?
在函数前实际上是约束函数的返回的,表明返回的值不能做左值,实际上就是防止返回值直接被赋值。但是一般的变量无法修改函数返回值,其实是为了防止函数返回类型为指针类型时,通过指针对返回值进行修改。非指针的函数返回类型前加const是没有意义的。

	const int function(); //此时const无意义

	const myclassname function(); //函数返回自定义类型myclassname.
  • 4、限定函数类型
    void function()const; //常成员函数, 常成员函数是不能改变成员变量值的函数。
class Point
{
public:
int GetX() const;
int GetY() const; //const修饰的其实是this指针
void SetPt (int, int);
void OffsetPt (int, int);
private:
int xVal, yVal;
};
//const成员函数应该在函数原型说明和函数定义中都增加const限定:
//const放在成员函数的后面 表明它不能修改类的数据成员。即限制类的成员函数不能对成员变量进行修改。
int Point::GetY() const
{
return yVal;
}
//而下面的函数改变Point对象:
void Point:: SetPt (int x, int y)
{
xVal=x;
yVal=y;
}
  • 5、定义常量
    const int a=10;
    int const a=10; 它们的含义是一样的。

你可能感兴趣的:(C++,c++,开发语言)