const在函数前后的意义(有点晦涩,但是请一定看完)

一、const在函数后面

1、只允许在类的非静态成员函数后面加const;(加到非成员函数 或 静态成员后面会产生编译错);

2、后面加的const其实是对隐含传入参数this指向类对象的修饰,即 *this 是被const修饰,那this所指向的类对象的成员都是不允许被修改的;

(备注:有人认为const修饰的是this指针,那么不能改变的就是this指针本身,而不是this指针指向的成员,其实这个const修饰的是this和(*this),下面代码有详细解释,this指针的实际参数是:const A * const this格式的)

3、唯一的例外是对于mutable修饰的成员。

4、加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用

也就是说:const 对象只能访问const函数,非const对象都可以访问

二、const在函数前面

1 、返回值为const;

上代码:

#include <iostream>
#include<memory>
#include<string>
#include<vector>
#include<list>
#include<typeinfo>
using namespace std;
//const和函数结合
//一、const在函数后面
//1、只允许在类的非静态成员函数后面加const;(加到非成员函数 或 静态成员后面会产生编译错);
//2、后面加的const其实是对隐含传入参数this指向类对象的修饰,即 *this  是被const修饰,
//那this所指向的类对象的成员都是不允许被修改的;
//(备注:有何友人认为const修饰的是this指针,那么不能改变的就是this指针本身,
//而不是this指针指向的成员,其实这个const修饰的是this和(*this),下面代码有详细解释)
//3、唯一的例外是对于mutable修饰的成员。
//4、加了const的成员函数可以被非const对象和const对象调用,
//但不加const的成员函数只能被非const对象调用

//二、const在函数前面

// 1 、返回值为const;

void func1(int a, int b)const//error  参考规则1  只允许在类的非静态成员函数后面加const;
//(加到非成员函数 或 静态成员后面会产生编译错);
{
}
static int func2()const//error参考规则1  只允许在类的非静态成员函数后面加const;
//(加到非成员函数 或 静态成员后面会产生编译错);
{
}
class A
{
public:
	void add(int a, int b)const//OK    其实这是传入的this指针应该是这样的形式:
	// const A * const this 所以this  和*this  都不允许改变
	{
  m_c = 100;//ok  
  m_a = 100;//
  this = 0XFFFF0048;//error 
	}
static void sub(int a, int b)const//error  参考规则1  只允许在类的非静态成员函数后面加const;
	//(加到非成员函数 或 静态成员后面会产生编译错);
	{
}
private:
	int m_a;
	int m_b;
	mutable int m_c;
};
const char* func3()
{
	char *m = "test";
	return m;
}
int main()
{
	char * p = func3();//error  返回值为const;  char*p 不是 const
	const char * s = func3();//ok
	cout << s << endl;
}


————————————————

版权声明:本文为CSDN博主「越甲八千」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/doubleintfloat/article/details/109320008