本文主要是介绍c11 override声明,函数饰词的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.override 声明词
无论何时,只要你在派生类中声明了一个函数,而且该函数意在改写基类中的一个虚函数时,请确保你给该函数加上此关键字。
如果函数加上此关键字,则编译发现虚派发时的语法错误会报错提示。
class base
{
public:base(int name) :base_name(name) {}int base_name;virtual void fun()const { std::cout << "base fun"; }};
class wigit //:public base
{
public:public:wigit()=default;wigit(const wigit&&wigit_copy ){this->wigit_name = wigit_copy.wigit_name;this->m_vec = wigit_copy.m_vec;}void fun()const override{//wigit_name = 0;std::cout << "wigit fun";}};
2.函数饰词的用法和一些功能
base& returnvec()& //以*this为左值时调用此重载函数
{
return m_b;
}base returnvec()&& //以*this为右值时调用此重载函数
{
return m_b;
}注意,饰词也会影响函数的重载
如果使用如下测试代码:auto res = wig.returnvec();则左值对左值,将函数返回的左值赋值给res.
如果使用auto res = wigit::create().returnvec();,则右值对左值,如果没有右值饰词的重载函数,returnvec 函数将被调动的是这个:
base& returnvec()
{
return m_b;
}
,将会将右值对象再进行拷贝一个左值对象返回。其实这个拷贝是多余的,我们完全可以用创建wigit实例函数返回的右值,调动右值饰词,移动构造地来返回资源,(右值饰词返回的右值被用来做base移动构造函数的形参,优先调动移动构造从而不需要额外的拷贝)
class base
{
public:base(int name) :base_name(name) {}base(const base& base_copy){std::cout << "base copy construct";}base (const base &&base_move){std::cout << "base move construct";this->base_name = base_move.base_name;}};
class wigit
{
public:static wigit create() { return wigit(); }int wigit_name{ 100 };base m_b{100};
public:wigit()=default;wigit(const wigit&&wigit_copy ){this->wigit_name = wigit_copy.wigit_name;this->m_vec = wigit_copy.m_vec;}base& returnvec(){return m_b;}base& returnvec()&{return m_b;}base returnvec()&& //利用饰词控制返回的左值和右值的型别,{ //对*this的左右值类型执行不同的重载函数;return std::move(m_b);}};int main()
{wigit wig;//auto res = wig.returnvec();auto res = wigit::create().returnvec();/*如果是返回右值的成员参数,则不需要进行无畏的拷贝构造(以调动base& returnvec()函数为例,从右值到左值引用会调动base的拷贝构造,),调动base returnvec()&&,从而直接调动base的移动构造,避免了不必要的拷贝。*/return 0;
}
这篇关于c11 override声明,函数饰词的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!