相关文章推荐

该函数的返回值是一个 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");
    

    因为显然,文件描述符不是一个编译时就可以确定的值。

    分类:
    阅读
    标签:
     
    推荐文章