C++ 关键字const使用说明

对于C++中的const关键字来说,主要有以下几类用法:

1、声明一个常量

       其使用语法: const   <>  <>  = <>;   

       示例: 

               const int TABLE_SIZE = 100; 

               const char LABLE = 'c';

       此外,类型这种内置类型的const常量一样,我们还可以定义const对象。例如 Class A {...};  则可以 这样定义const 对象 const A a;则此时a为一个const对象,只能调用常量成员函数。


2、常量成员函数

      const可以放置到成员函数的参数列表后面,表明这个函数是一个常量成员函数。 常量成员函数可以查看某个对象的状态,但是不能修改其对象。

      为什么要使用常量成员函数?

       有两个原因:

        A、用于提高程序可读性和可靠性,明确声明为常量的成员函数则不会修改对象,若代码中对对象进行了修改,则编译器可以帮助我们进行检查,避免了人为疏忽 造成的错误。

B、让const常量对象可以调用常量成员函数。如果有一个const 对象,则该对象只能调用类中的常量成员函数,不能调用非常量成员函数。 (非const 对象则不受const限制,所以既可以调用非常量成员函数又可以调用常量成员函数。)

        另外,要注意的事情: const成员函数中也不能调用非常量成员函数。如果允许const成员函数调用非const成员函数,则会导致const对象在调用const成员函数时间接调用了非const成员函数。

        举例如下:

class TestConstFunc
{
public:
	TestConstFunc(int val = 0):value(val)
	{

	}
	~TestConstFunc()
	{

	}
	void setValue(int val)
	{
		value = val;
	}
	int getValue()const
	{
		return value;
	}
	void print()const
	{
		std::cout << value << std::endl;
	}
	void print_no_const()
	{
		std::cout << value << std::endl;
	}
private:
	int value;
};

void TestConstObject()
{
	int x = 0;
	TestConstFunc obj;
	obj.setValue(4);
	x = obj.getValue();
	obj.print();
	obj.print_no_const();

	const TestConstFunc const_obj(10);
	//const_obj.setValue(3);   //ERROR: setValue 企图修改const对象中的成员数据
	//const_obj.print_no_const(); //ERROR: print_no_const 虽然没有企图修改const对象中的成员数据,但是没有const修饰,所以不允许const对象调用。
	const_obj.print();
	x = const_obj.getValue();
}

在类TestConstFunc中,有一个构造函数和一个析构函数,此外有两个非常量成员函数setValue和print_no_const,两个常量成员函数getValue和print。 当用户在TestConstObject函数中,声明一个非const对象obj时,该对象由于不是const对象,则obj可以调用该类的所有函数。而 const_obj对象由于是一个const对象,则该对象只能调用常量成员函数,调用非常量成员函数则导致编译器错误。(代码中注释的部分)

               

3、const引用参数

在C++中使用引用作为函数参数主要目的有两个:A、以引用传递的参数可以在函数中修改并传递到被调用函数;B、当参数为用户定义类型时,使用引用作为函数参数传递,可以避免大对象的赋值传递开销。

         如果我们使用引用的目的是B项的要求时,一般可以将引用参数声明为const,则避免了在传递的函数内部对传递参数的修改。

        例如:

        double distance(const point &p1, const point &p2);这样在distance函数内部则不能对p1和p2进行修改,只能读取p1和p2的值,防止由于参数修改影响调用函数。

4、静态成员常量

        在类中,静态成员常量的声明前面有两个关键字,分别为static和const。关键字static表明,整个类只有一个该成员的副本,而关键字const则表明程序不能修改这个值(就像普通声明的常量一样)。

        例如: static const size_t TABLE_SIZE = 100;  说明了类中的一个表的大小为100。

除了在类定义声明静态成员变量以外,在实现文件中还必须重复这个常量的声明(此时不比使用关键字static)。

        例如: const  size_t  class_name::TABLE_SIZE;   

        注意:此处的初始值100只能在头文件中(不能再实现文件中)给出。但是,在头文件中定义值的这种技术,只适用于整数类型,比如int或者size_t 。非整数类型则必须采用另外一种方式,把值放到实现文件中,而不能放到头文件中。

       例如:  头文件中: static const double d;      实现文件中:const double d = 3.1415;

5、常量迭代器(所指向的对象不能修改)

        常量迭代器是一种不以任何方式修改容器的迭代器。它可以再容器中进行移动,但禁止添加、删除或者修改任何数据项。

        例如:

#include <vector>
using std::vector;

// 在vector里面找到比target值小的元素个数
vector<int>:: size_type count_less_than_target(const vector<int>& vec, int target)
{
	int answer = 0;
	vector<int>::const_iterator it;  //it 为const常量迭代器,只能在vector容器中移动,不会修改容器数据

	for (it = vec.begin(); it != vec.end(); ++it)
	{
		if (*it < target)
		{
			++answer;
		}
	}
	return answer;
}

void TestCntLessThanTarget()
{
	vector<int> a;
	a.push_back(2);
	a.push_back(3);

	int x = count_less_than_target(a, 4);
	std::cout << x << endl;  // x=2
}

6、const可以作为指针或者数组参数的修饰符,表示该指针或者数组参数为常量参数

      使用类型:  fun(const int* i_ptr)

       此情况下这些函数可以查看由指针所指向的数据项,但禁止修改数据项。

 









  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C++ 中,const_cast 是一种用于转换 const 或 volatile 类型的指针或引用的关键字。它可以去掉指针或引用类型的常量性或易变性,但是需要注意,这种转换可能会导致未定义的行为。 下面是一个使用 const_cast 的简单示例: ```c++ void func(const int* ptr) { int* writable = const_cast<int*>(ptr); *writable = 100; // 通过 writable 修改指向的值 } int main() { int num = 10; const int* ptr = &num; func(ptr); // 调用 func 函数,修改 num 的值 return 0; } ``` 这个例子中,我们定义了一个 const int 类型的指针 ptr,它指向变量 num。在 func 函数中,我们使用 const_cast 去除了 ptr 指针的常量性,并将其赋值给了 int* 类型的 writable 指针。然后,我们通过 writable 指针修改了 num 的值。 需要注意的是,使用 const_cast 进行类型转换时需要非常小心,因为它可能会破坏原本的常量性或易变性,导致未定义的行为。因此,应该尽可能避免使用 const_cast,除非确实需要修改 const 或 volatile 对象。 ### 回答2: const_cast是C++中的一个关键字,用于将const属性从一个指针或引用中移除。它可以显式地将常量指针或引用转换为非常量指针或引用。 const_cast的使用场景可以分为两种情况。第一种情况是当我们需要修改一个以const声明的非指针或引用类型的变量时,使用const_cast可以去除其const属性。例如,当我们传递一个常量引用给一个函数,而这个函数需要修改该变量的值时,我们可以使用const_cast将其转为非常量引用,从而实现对变量的修改。 另一种情况是当我们需要修改一个以const声明的指针或引用类型的变量所指向的内容时,使用const_cast也可以实现。这通常发生在一个函数接受非常量指针或引用类型的参数,但在内部需要对参数所指向的内容进行修改时。在这种情况下,使用const_cast将常量指针或引用转换为非常量的形式,然后对其所指向的内容进行修改,可以达到我们的目的。 需要注意的是,虽然const_cast可以改变指针或引用的常量属性,但其本质上并不会真正去除对象的常量性。通过const_cast的修改操作可能会引发未定义行为或安全问题,因此使用const_cast时应当非常谨慎。我们应当遵循C++的常量性规则,并确保对常量对象的操作不会导致不可预期的结果。 总之,const_cast是C++中的一个关键字,它的主要作用是用于将const属性从指针或引用中移除,从而实现对常量对象的修改。但使用const_cast需要谨慎,遵循C++常量性规则,以确保程序的正确性和安全性。 ### 回答3: 关键字const_cast是C++中的一个强制类型转换符号,用于去除指针或引用变量的const或volatile属性。 在C++中,const修饰的变量表示其值是不可修改的,而volatile修饰的变量表示该变量可能会在任何时间被修改或读取,不受编译器对该变量的优化。 const_cast用于改变指针或引用的常量或易变性属性,使其能够修改被const修饰的变量。 const_cast的使用方式如下: 1. 将指针或引用从const转换为非constconst_cast<T*>(ptr)。其中T为指针所指向的类型,ptr为被const修饰的指针。 2. 将指针或引用从volatile转换为非volatile:const_cast<T volatile*>(ptr)。其中T为指针所指向的类型,ptr为被volatile修饰的指针。 需要注意的是,const_cast只能用于去除指针或引用变量的常量属性,而不能改变实际的变量本身,否则会导致未定义的行为。另外,使用const_cast去除const或volatile属性应该是谨慎的行为,只有在确保被修改的变量实际上不会被修改的情况下才能使用。 综上所述,const_cast关键字C++中用于去除指针或引用变量的const或volatile属性,使其能够修改被const修饰的变量。但需要注意使用时的谨慎和合理性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值