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-
浙公网安备 33010602011771号