C++----有关const使用

1、类的成员函数加上const

类的成员函数后面加上const

struct type {
    int i;
 
    type(): i(3) {}
 
    void f(int v)  const {
        // this->i = v;                 // 编译错误:this 是指向 const 的指针
        const_cast<type*>(this)->i = v; // 只要该对象不是 const 就 OK
    }
};

1)意味着类的成员函数并不会修改类的数据成员。

2)意味着函数体内出现的this指针类型为const

3)意味着可以被 非const和const类的对象调用。 而类的的const对象不能调用非const成员函数。

#include<iostream>
#include<cstring>
#include<memory>
#include<algorithm>
#include<vector>
#include<thread>
#include<map>

class A{
  public:
    int a = 10; 
    //const成员函数
    void set() const;
    // 非const成员函数
    void prin() {
      std::cout << a << std::endl;
    }   
    std::shared_ptr<int> x = std::make_shared<int>(5);
    std::map<int, int> maps{{1,1},{2,5}};
};

void func( std::shared_ptr<int> x) {
  std::cout << *x << std::endl;
}

void A::set() const {
//因为this指针为const ,所以通过this指针调用的类成员,都带有const修饰符
  const int *b = &a; 
  int *z = const_cast<int*>(b);
  *z = 1;
  *x = 100;

  func(x);
  prin();//报错,不能在const成员函数中,调用非const类成员函数。
  if(maps.find(1) != maps.end())
  std::cout << maps[1] << std::endl;//报错,不能调用map operator[]运算符,此运算符为非const运算符 
}

int main() {
 A d;
 d.set();
 std::cout << d.a << std::endl;
 
  return 0;

}

2、顶层const与底层const

const int *const p = &a; // a为已经定义的int型别指针。
//编译器要求我们

1)顶层const 意味着指向的对象为const数据成员。该数据成员不可修改。第二个const。

2)底层const 意味着该指针为const指针。以为着该指针无法指向别人。第一个const。

3)const 引用以为不可以通过该引用修改原来变量的值。const int &r = i; //i为已经定义的变量

3、形参中的const

int func(const int i);

形参中的const意味着 函数无法对该形参作出修改。

4、有关constexpr 常量表达式

constexpr int m = 20;       // 常量表达式
constexpr int lim = m + 1;  // m + 1 为常量表达式
constexpr int sz = size()   // 只有size()为constexpr函数时 该语句才正确。

将变量或者函数声明为constexpr。以为着由编译器检查其是否为常量。在编译期间用常量进行替换,consexpr函数在编译期间就可以得到结果。

constexpr 如果放在声明指针的前面意味着 该指针为常量指针。仅对指针有效,对指针所指对象无效。

constexpr int *p = 1; //指向1的常量指针,作用相当于顶层const,但是语句在编译期就可执行

-END-

posted on 2020-11-02 10:35  Smarc  阅读(131)  评论(0)    收藏  举报