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