c++之说_15|成员函数的const尾缀修饰 (& && const& const&&)

我记得我刚接触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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值