C++基本概念总结——const 和 非const

来源:互联网 发布:linux ping的使用 编辑:程序博客网 时间:2024/05/29 17:19

const成员函数

类的成员函数后边增加一个 const 关键字,表示该函数为 const 成员函数。考虑如下类A的定义,f1为 const 成员函数,f2为 非const 成员函数:

class A{public:A(int i) : m_id(i) {}void f1() const; // const 成员函数void f2();       // 非const 成员函数 private:int m_id;};

在 const 成员函数中不能修改类的成员变量,如下代码会导致编译失败:

void A::f1() const{m_id = 1; // 编译失败!不能修改类的成员变量}

此外,类的 const 对象,只能访问其 const 成员函数,如下代码中只有对 f2 的调用会导致编译失败:

const A a(1);a.f1(); // 编译成功a.f2(); // 编译失败,不能访问非 const 成员函数

 

const成员变量

非静态 const 成员变量需要通过初始化列表进行初始化。静态 const 成员变量通过显示的定义进行初始化。

class A{public:A(int i) : m_id(i){}  // 非静态 const 成员变量通过初始化列表初始化private:const int m_id;static const int s_id;};const int A::s_id = 1; // 静态 const 变量通过显示的定义进行初始化


const指针

const指针定义时,根据 const 关键字和 * 的位置,可以分成两种情况。

char buf[4] = "abc";const char* p1 = buf;char const* p2 = buf;char* const p3 = buf;

例如上面的代码中,p1和p2表示的含义相同(const 关键字在 * 的左边),表示指针指向的内容是 const 的,但指针本身是 非const。p3 (const 关键字在 * 的右边)表示指针本身是const的,但其指向的内容是 非const。

char c = 'd';p1[0] = c; // 编译失败,其指向的内容是const的,不能修改p2[0] = c; // 编译失败p1 = &c;  // 编译成功p2 = &c;  // 编译成功p3[0] = c; // 编译成功p3 = &c;  // 编译失败,指针本身是const的,不能修改
原创粉丝点击