我记得我刚接触c++的时候  遇到成员函数 右边尾部  写了个const 我当时就很蒙 
 不过慢慢的也从大佬口中获得一二经验了
class kj
	{
	public:
		void get()
		{
			printf("无修饰\n");
		}
		void get()const
		{
			printf("const 修饰\n");
		}
	};大概就是这个样子 当时我抓耳挠腮的看不懂啊 怎么写法没学过呢(学得少了)
main函数调用
int main()
{
	
	kj f = kj();
	const kj f2 = kj();
	
	
	f.get();
	f2.get();
	return 0;
}结果

我们都知道const对象是不希望改变的 但是我们写的很多成员函数都或多或少的 改变了this对象
所以const尾缀修饰的成员函数 就是专门给 const对象调用的 const对象没有资格调用非const尾缀修饰的成员函数
在指针上也是一样的
kj* pf = &f;
const kj* pf2 = &f2;
pf->get();
pf2->get();
有人会说 非const 对象 难道就没法调用 const尾缀修饰的函数了吗?
当然是可以的 但是反过来就不行了
kj f = kj();
f.get();
最近我见到一个用& && const & const&& 尾缀修饰的
烧是真的烧
所以来看看
class kj
	{
	public:
	
		void get()&&
		{
			printf("&&\n");
		}
		void get()const&&
		{
			printf("const &&\n");
		}
		void get()&
		{
			printf("&\n");
		}
		void get()const&
		{
			printf("const &\n");
		}
	
	};main
int main()
{
	const kj&& pp1 = kj();
	const kj& pp2 = kj();
	
	kj f = kj();
	const kj f2 = kj();
	kj& pp3 =f;
	kj&& pp4 = kj();
	
	f.get();
	f2.get();
	pp1.get();
	pp2.get();
	pp3.get();
	pp4.get();
	kj().get();
	const kj().get();
	return 0;
}
我们看到
f 是一个左值对象(变量) 调用的是 & 尾缀修饰的函数
f2 是const 修饰的左值对象(变量) 调用的是const & 尾缀修饰的函数
pp1 是const 修饰的右值引用对象(变量) 调用的是const & 尾缀修饰的函数
pp2 是const 修饰的左值引用对象 (变量)调用的是const & 尾缀修饰的函数
pp3 是左值引用对象(变量)调用的是 & 尾缀修饰的函数
pp4 是右值引用对象(变量)调用的是 & 尾缀修饰的函数
而
kj().get(); 完全的右值临时对象调用 get函数 调用的是 && 尾缀修饰的函数
 const kj().get(); 完全的const 右值临时对象调用 get函数 调用的是const && 尾缀修饰的函数
大家是不是好奇 pp1 pp4 明明是右值引用的对象(变量) 为啥调用的是 左值引用尾缀修饰的函数
之前说过 有名的右值叫左值
所以她两就是本就是左值 因为有名了 右值引用 引用的那一刻 她们便有了名字
kj()这种才叫无名右值 还有 函数返回值(非左值引用返回) 也属于无名右值
kj create1()
{
	auto n = kj();
	return n;
}
kj&& create2()
{
	
	return kj();
}
///
create1().get();
create2().get();
还有就是  &  和 const &  与  无修饰  和 const 修饰的  一样 无法重写
     
参考代码
class kj
	{
	public:
		/*void get()
		{
			printf("无修饰\n");
		}*/
		/*void get()const
		{
			printf("const 修饰\n");
		}*/
		void get()&&
		{
			printf("&&\n");
		}
		void get()const&&
		{
			printf("const &&\n");
		}
		void get()&
		{
			printf("&\n");
		}
		void get()const&
		{
			printf("const &\n");
		}
		/*void get()
		{
			printf("const &\n");
		}
		void get()const
		{
			printf("const");
		}*/
	};
kj create1()
{
	auto n = kj();
	return n;
}
kj&& create2()
{
	
	return kj();
}
int main()
{
	const kj&& pp1 = kj();
	const kj& pp2 = kj();
	
	kj f = kj();
	const kj f2 = kj();
	kj& pp3 =f;
	kj&& pp4 = kj();
	
	f.get();
	f2.get();
	/*
	kj* pf = &f;
	const kj* pf2 = &f2;
	pf->get();
	pf2->get();*/
	pp1.get();
	pp2.get();
	pp3.get();
	pp4.get();
	kj().get();
	const kj().get();
	create1().get();
	create2().get();
	return 0;
}


















