【从 C 向 C++ 进阶】- 类 - 7. 类与 const

从 C 向 C++ 进阶系列导航


1. const 对象

const 对象为只读对象,只能调用 const 成员函数,因此无法直接修改成员变量。可通过指针方式间接访问非 const 成员函数与修改成员变量。

  • 实验:
class Test 
{
private:
	int m_Var;
	
public:
	Test(int num)
	{
		m_Var = num;
	}
	void print_con(void)const
	{
		cout << "m_Var = " << m_Var << endl;
	}
	void print(void)
	{
		cout << "m_Var = " << m_Var << endl;
	}
    void set(int num)	
	{
		m_Var = num;
	}
};

int main()
{
    const Test obj = 3; 
	// obj.print();	    // error: passing ‘const Test’ as ‘this’ argument discards qualifiers
	obj.print_con();    // m_Var = 3
	Test* p = (Test*)&obj;
	p->set(4);         
	obj.print_con();    // m_Var = 4
    return 0;
}

2. coust 成员变量

const 成员变量必须在类的构造函数中通过初始化列表方式进行初始化,其余属性与普通的 const 变量一致。

  • 实验:
class Test 
{
private:
	const int m_Var;
	
public:
	Test() : m_Var(8)
	{
	}
	void print(void)
	{
		cout << "m_Var = " << m_Var << endl;
	}
	void set(int num)
	{
		// m_Var = num;	    // error: assignment of read-only member ‘Test::m_Var’
		int* p = (int*)&m_Var;
		*p = num;
	} 
};

int main()
{
    Test obj; 
	obj.print();	        // m_Var = 8
	obj.set(3);
	obj.print();	        // m_Var = 3
    return 0;
}

3. const 成员函数

const 成员函数有以下特点:

  • const 成员函数的声明和实现必须要使用 const 关键字限制。
  • 如果 const 成员函数构成函数重载,const 对象只能调用 const 成员函数,非 const
    对象优先调用非 const 成员函数。
  • const 成员函数内只能调用 const 成员函数。非 const 成员函数可以调用 const 成员函数。
  • const 成员函数内不能直接修改成员变量,但可以通过指针间接修改。
  • const 成员函数内不能直接取成员变量地址,但可以通过类型转换进行取地址操作。

const 成员函数定义方式为:

type classname::functioname(...) const;

特殊地,如果需要在 const 函数内调用成员变量的非 const 成员函数,此时可以使用 mutable 关键字声明成员变量解除 const 函数对该成员变量的非 const 成员函数的限制。

发布了60 篇原创文章 · 获赞 36 · 访问量 5957

猜你喜欢

转载自blog.csdn.net/qq_35692077/article/details/95892673