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