const关键字
写过一些知识点的文章,但是写的都比较粗糙,总是自己学会了就简略的写一下,自己都看不下去了,从今天开始,认真的写每一篇文章,尽量使像我第一样的的菜鸡也可以理解、明白。
下面主要介绍const关键字的四个作用。 ps:不保证所说的每一话都正确 请大佬略过 小白可以看看。
1:const 和普通变量 2:const 和指针
3:const 和函数 4:const 和类及其对象
1.const 和普通变量
这个是最简单最容易理解的,在声明变量时,在前面加上一个const 这样就定义了一个常量,比如:const float pi = 3.14或者float const pi = 3.14 ,两者一样,此时pi就成为了一个常量。
2. const和指针
这个主要包含两个名词 :指针常量、常量指针
我在初学的时候,一直记不清或者说记混这两个名字,今天在这里分享一下记忆的方法。简单点说,谁在前面谁就是不可改变的,比如说:常量指针,常量在前面,这个就是const在修饰那个常量,常量就不能改变,这个指针的值可以改变,在下面我会附上代码 进行展示。指针常量类似。正式一点说就是const这个关键字修饰谁,谁就是常量,就是不能被改变。
const int *p = &a; 常量指针一旦初始化完成,它的值,也就是它所放在指针中的地址就不能变
int const *p = &a; //两句话是等价的 此时p都是一个常量指针
*p = 50; //这样就是错误的 p是常量指针 其指向的值时不能被改变的
这里在啰嗦一句 ,我们要搞明白一件事,那就是const是C/C++的修饰符,他修饰谁,谁就不是可变的。比如:
const int *p = &a;
int const *p = &a;
这两条语句作用是一样的,都是定义了一个常量指针p,指向常量a。 大家看 const无论放在int前面和int后面他都是和 int 挨着,和指针 p 之间还隔着一个 * 呢! 所以这时候const修饰的是 int 整形 也就是 a,所以a是不能被改变的。
下面同样理解一下指针常量就可以了:
int a = 20;
int b = 50;
int * const p = &a;//定义一个指针常量
p = &b; // 错误 因为p是一个常量 所以不能再被赋值了
这里需要注意一下,定义常量是需要为其赋值的,比如const int a ;这样是不对的,必须const int a = 20;同样定义一个指针常量的时候,也必须为这个指针常量赋值 ,比如int * const p ;这样不对,int * const p = &a;就正确了。其实const和指针的关系理解到这里基本就可以了。嘿嘿!
3:const 和函数
const关键字主要和三种函数有关系。
1:第一种: 采用 “值传递”的函数 const int fun()
在一个C文件中,除了main函数 我们可能还会写各种各样的功能子函数。下面附上代码 清楚说明。
# include <iostream>
const int fun()
{
return 5;
}
void main()
{
int a;
a = fun();
}
一开始在这个问题上我想了很久,怎么也没明白这种 函数加上一个const有什么作用??
哈哈,后来找到,这个东西就是没啥卵作用!!
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,
加const 修饰没有任何价值。const int fun() 这个const 是没有任何作用的!!
第二种:采用 “指针传递”的函数 const int * fun()
这里的const 是有作用的 ,就是这个返回的常量指针必须赋值给一个常量指针 。如下
# include <iostream>
const int * fun()
{
int a = 5;
return &a;
}
void main()
{
const int *p ;
p = fun(); //正确
int * q;
q = fun(); //错误
}
第三种:int fun (const int a ) const 修饰形参
这种比较简单,在相应的函数中不能改变形参的值。
4:const和类及其对象。
这里const和类的关系就是在类中定义函数的时候,在类中定义的函数后面加上一个const 比如: void fun ()const我们这里可以把这种函数叫做 const 成员函数。
这里const类对象 只能调用const成员函数 ,非const对象可以调用各种成员函数。如下
# include <iostream>
using namespace std;
class Ponit
{
public:
Ponit(float a ,float b );//构造函数 初始化 变量
float get_x() const;//获取x的值
float get_y() const;//获取y的值
void move(float a, float b);
void printf1() const;
private:
float x;
float y;
};
Ponit :: Ponit (float a = 0, float b = 0):x(a),y(b)
{
}
float Ponit::get_x() const
{
return x;
}
float Ponit::get_y() const
{
return y;
}
void Ponit::move(float a, float b)
{
x = a;
y = b;
}
void Ponit::printf1() const
{
printf("(%f,%f)\n", x, y);
}
void main()
{
const Ponit a;//定义一个常量对象 只能调用 const成员函数
Ponit b;//定义Ponit 对象 可以调用类中所有的函数
b.move(5, 6);
// a.move(5, 6);//错误 const 对象 只能调用 const 函数
a.printf1();
b.printf1();
}
目前只掌握了这么多 ,如果有什么问题,欢迎随时 指出。
如果看了有一点点收获,麻烦点个赞,点个关注, 谢谢 嘿嘿