const 与指针的组合区分
1 三个好基友
const int* , int const * , int* const
前两个都是一个意思:指向整型常量的指针
最后一个是:常量指针
1.1 记忆方式
const 在 *的左右还是右边。
-
如果const的左边是类型,那么说明,这个类型值是不能动的,即,这是指向一个不能动的值(常量)的指针。所以int const * p1是一个指向整型常量的指针。
-
如果const的左边是*,那么说明,这个指针是不能动的(*意味着指针嘛),即,这是一个不能动的指针(常量指针)。所以int * const p2是一个指向整型的常量指针。
1.2 练习
-
const int*
不能通过指针修改变量值
int x = 12; const int *p1 = &x; cout << "p1 " << *p1 << endl; // 12 x = 20; cout << "p1 " << *p1 << endl; // 20 int y = 30; p1 = &y; cout << "p1 " << *p1 << endl; // 30 *p1 = *p1 + 1; // 报错
-
int* const
指向的地址不能改变,也就是常量指针
int x = 12; int z = 40; int* const p2 = &z; p2 = &x; // 报错
1.3 参考博客
const int *p 和int const *p和int * const p,总有人搞不懂,对吧_AYZP的博客-CSDN博客
2 const 与智能指针
2.1 const shared_ptr
-
练习
const auto ptr = make_shared<int>(10); *ptr += 1; // 10 + 1 = 11 ptr++; // 报错 ptr = make_shared<int>(20); // 报错
-
总结
指针指向的内容可以修改,但是指针地址不能修改,就是说const 针对的是最外层(指针)。 const 修饰的是指针。
2.2 shared_ptr
-
练习
auto ptr1 = make_shared<const int>(100); cout << *ptr1 << endl; // *ptr1 += 1; // 报错 ptr1 = make_shared<int>(10); // 10 cout << *ptr1 << endl;
class A { public: void SetX(int x) { m_x = x; } int GetX() const { return m_x; } private: int m_x {0}; }; auto ptr = make_shared<const A>(); // ptr->SetX(10); // 报错 ptr->GetX(); // 注意:GetX() 必须要加const限定
-
总结
该const 限定的是内容,内容不能被修改,注意如果是类的指针指针,不能调用类的非const成员函数