该函数的返回值是一个
const int
,也就是说返回值不可改。修改返回值将导致编译报错
MyType MyClass::showName(string id) const
说明该函数是该类的一个 const
成员函数,该函数不能修改其所在类的任何成员变量(除非成员被明确标识为 mutable
)。试图在其中修改成员值将导致编译报错。
实际上,这是由于 C++ 的成员函数都隐含了一个指向自身的 this 指针参数导致的。实际的该函数类似于下面这样:
MyType MyClass::showName(MyClass *this, string id) const { ... }
末尾的 const 起到的效果类似于
MyType MyClass::showName(const MyClass *this, string id) { ... }
this 变成了 const 类型。因此也就不能修改自身值了
在最开始和末尾
const MyType MyClass::showName(string id) const
同时具有上面的两种性质
const 修饰参数
void printReference (const string& str)
cout << str;
void printReference (string&& str)
cout << str;
第一个函数能够接收左值,因为参数表中写的是左值引用。同时也能接收右值,因为参数是 const
的,而右值是可以绑定到 const
的左值引用的。
第二个函数只能接收非 const
的右值,因为无法从引用中隐式地删除 const
,且右值
const 修饰变量作为常量
使用 const
修饰的变量值无法修改。
const
修饰的变量只有在程序运行时才会被初始化并动态绑定的。若要在编译时静态绑定常量值,可以使用 constexpr
constexpr
C++ 中推荐的常量定义方式:
constexpr int RECVID = 12
constexpr
的出现,可以让编译器在编译时对这句话做三件事:
可能会将该值在其被使用的地方内联;
若在作用域内出现重名,编译器可以报错;
可以在编译时保证类型安全
应使用 const 而不是 constexpr 的情况
有些不可变量的值需要在运行时才能确定,文件描述符就是一个典型的例子:
const int fd = GetFileDescriptor("file.txt")
因为显然,文件描述符不是一个编译时就可以确定的值。