C++: const修饰类成员变量、类成员函数、普通变量和普通函数

C++

const修饰类成员变量、类成员函数、普通变量和普通函数

1. const修饰类成员变量

  • const修饰的类成员变量,只能通过直接赋值(例如:a)、通过构造函数的初始化列表来赋值(例如:b)、和 const_cast来修改值(例如:c)
class A
{
public:
	A(int b_, int c_) :b(b_), c(c_) {}

	void doSometing()
	{
		int *p = const_cast(&c);
		*p = 15;
	}

public:
	const int a = 5;
	const int b;
	const int c;
};

2. const 修饰类成员函数

  • const在类成员函数前,对于返回一个const修饰的变量的引用(例如:a),必须要返回常量引用(例如:doSometing1),因为不返回常量引用,外部可能通过该引用修改变量值。

  • const在类成员函数后,实质修饰的是this指针,相当于const *this,这样就不能通过成员函数来修改成员变量的值(例如:b),同上理由返回的引用也必须使常量引用。

  • 若某成员变量有mutable关键词修饰,则const修饰的成员函数可以修改该成员变量值(例如:c),也可返回非常量引用。

    class A
    {
    public:
    	A(){}
    
    	const int& doSometing1()
    	{
    		return a;
    	}
    
    	int& doSometing2() const
    	{
    		b = 4;		//错误!,const放类成员函数后,不允许修改成员变量
    		return b;   //错误!,const放类成员函数后,返回变量引用,外部可能通过该引用修改变量值
    	}
    
    	int& doSometing3() const
    	{
    		c = 1;		//正确,const修饰的成员函数可以修改 mutable 关键词修饰的变量
    		return c;
    	}
    
    private:
    	const int a = 5;
    	int b = 5;
    	mutable int c = 5;
    };
    

3. const修饰的普通变量

  • const 修饰的普通变量,代表他是一个常量,只能通过const_cast来修改(例如:p2)
void doSometing()
{
	const int a = 5;
	int *p1 = &a;						//错误!,试图用非常量指针指向const
	int *p2 = const_cast(&a);		//正确
	*p2 = 10;
}

4.const修饰的普通函数

  • 只用对返回的是引用时,要求返回const 引用(例如:doSometing2),返回的非引用时,因为返回的是原变量的一份拷贝值,所以有无const都不会影响原变量的值
int& doSometing1(const int a)
{
	return a;		//错误! 外部可能通过该引用修改变量值
}

const int& doSometing2(const int &a)
{
	return a;
}

int doSometing3(const int &a)
{
	return a;
}

int doSometing3()
{
	const int a = 10;
	return a;
}

你可能感兴趣的:(C++,c++)