const经常犯错的要点
- 常成员变量
1.1. 只能在初始化列表赋值
1.2. 不能在类直接初始化- 在类中常成员函数是不能修改任何成员变量的
关于常成员函数不能修改成员变量的规定,我在网上搜了很多,大家举的例子都是 一个整形变量被修改的例子如下所示:
int GetLength() const {
return len++;
}
这样的不正确。没有关于map,hash_map, unordered_map的例子。
前段时间在写一个常成员函数的逻辑时候,通过[]去获取了map的value发现是编译不通过,于是我就修改成iterator的方式去获取value,发现还是编译不通过。于是开始思考,然后网上查找,最后才知道只能用const_iterator的方式在常成员函数中访问map成员变量。
通过这个例子发现很多概念只有在真正用的时候才有深刻的理解,尽管这些概念看了很多遍。
const知识要点
const int a;
int const b;
const int* c;
int * const d;
const int *const e;
含义:
//第一个第二个意思一样 代表一个常整形数
//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
举例如下:
#include<iostream>
#include<string>
#include<map>
using namespace std;
class A {
public:
const int x;
// const int x = 100; 错误
A();
A(int a);
~A() {}
void GetData(string name) const;
private:
map<string,string> name_map_;
};
A::A(int a):x(a) {
cout << "construcor with params" << endl;
}
A::A():x(0) {
name_map_["A"] = "张三";
name_map_["B"] = "李四";
name_map_["C"] = "王五";
}
void A::GetData(string key) const {
//cout << name_map_[name] << endl; 错误
// map<string, string>::iterator it = name_map_.find(key); 错误
map<string, string>::const_iterator it = name_map_.find(key);
cout << it->second << endl;
}
int main(void) {
A a1;
a1.GetData("A");
A a2(100);
cout << a2.x << endl;
return 0;
}