C++_Const的使用(2)

本文详细解析C++中const关键字的使用方法,包括修饰成员变量、成员函数及对象等应用场景,强调其对代码质量和安全性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3、与类有关的const

1)const修饰成员变量:成员常量不能被修改初始化:

方法一:只能在构造函数的初始化列表中赋值----比较常用

class A    
{      
private:
	const int n;   //成员常量不能被修改    
public: 
	A(int x): n(x) //只能在初始化列表中赋值
	{ } ;   
}

方法二:把变量static 和 const 并用,在外部初始化

class A
{
public:
	A() 
	{} 
private: 
	static const int i; //注意必须是静态的!
}; 
const int A::i=3;

注意:为什么const成员不能在构造函数体中进行初始化?

原因:在构造函数中那叫赋值,因为定义在类中已经定义好了,之后只需要在构造函数赋值就可以了,这是定义和赋值时分开的。但是,const变量是必须在定义的时候初始

的,因此只能使用初始化列表中进行,表示是在定义时就能初始化。

2)const修饰成员函数:常函数,函数体为常量,不能改变其他非const成员的值

使用时间:任何不会修改数据成员(即函数中的变量)的函数都应该声明为const 类型

const位置:一般写在函数的尾部来const修饰的成员函数

主要作用:只能被const类对象、指针、引用调用

class A
{ 
	void function()const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。
}

说明:

注意一:在const成员函数内部不允许修改数据成员。反过来,将修改数据成员的成员函数声明为const将导致编译错误。

注意二:const成员函数不允许调用非const成员函数,而只能使用const成员

                非const成员函数可以调用const成员函数。

注意三:可以对const成员函数进行非const版本的重载

注意四:构造函数和析构函数不允许声明为const类型。构造函数既可以初始化const对象,也可以初始化非const对象。析构函数同理。

注意五:建议将不修改数据成员的成员函数都声明为const。当编写这种成员函数时,若不经意修改了数据成员,编译器将产生错误信息。

代码:

const重载

#include<iostream>
using namespace std;
class A
{
private:
	int a;
	const int b;
public:
	A(int i,int j):b(j)
	{
		a=i;
	}
	void print()
	{
		cout<<"非const函数"<<endl;
		cout<<a<<b<<endl;
	}
	void print ()const
	{
		cout<<"const函数"<<endl;
		cout<<a<<b<<endl;
	}
};
void main()
{
	A a(1,2);
	a.print(); //a为普通的对象,会调用普通的成员函数
	const A aa(3,4);
	aa.print();//aa为常对象,会调用常成员函数
	system("pause");
}

注意四:同一成员函数名,若只有const型,则非const对象可以调用该成员函数,即调用const成员函数。 <见上面的例子const重载>

注意五:同一成员函数名,若既有非const型,又有const型(重载),则非const对象只调用非const成员函数。<见上面的例子const重载>

常对象和常成员函数的调用

#include<iostream>
using namespace std;
class A
{
private:
	int a;
	const int b;
public:
	A(int i,int j):b(j)
	{
		a=i;
	}
	void print ()const
	{
//		a=10;//错误,常函数中不能更新数据成员
		cout<<"const函数"<<endl;
		cout<<a<<b<<endl;
	}
	void set(int i,int j)
	{
		a=i;
//		b=j;//错误,const成员不能改变
	}
};
void main()
{
	const A a(3,4);
//	a.set(5,6);//错误,常对象不能调用非常成员,常成员函数是常对象唯一对外出口
	a.print(); //正确,常对象只能调用常函数。
	system("pause");
}

 

3)const修饰类对象、对象指针、对象引用:常量对象(对象指针和对象引用),任何成员都不能被修改,只能调用常成员函数。

注意一:const对象在定义后,其值不可被改变。

注意二:const对象不允许进行成员函数的调用,即使是不修改对象的成员函数也不行。除非成员函数本身也声明为const。      

                即:const对象只可调用const成员函数,不能调用任何非const成员函数(构造与析构函数除外)。      

               原因:任何非const成员函数会有修改成员变量的企图。

注意三:非const对象既可调用const成员函数,可调用非const成员函数。

注意四:同一成员函数名,若只有const型,则非const对象可以调用该成员函数,即调用const成员函数。 <见上面的例子const重载>

注意五:同一成员函数名,若既有非const型,又有const型(重载),则非const对象只调用非const成员函数。<见上面的例子const重载>

class A
{
	void func1();
	void func2() const;
} 
const A aObj;
aObj.func1(); //错误,常函数只能调用常成员函数
aObj.func2(); 正确
const A* aObj = new A();
aObj-> func1();//错误,常指针只能调用常成员函数
aObj-> func2(); 正确 

注意:
1、const对象只能访问const成员函数, 非const对象可以访问任意的成员函数=const成员函数+非const成员函数.

2、const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.

3、常量指针被转化成非常量指针,并且仍然指向原来的对象;

      常量引用被转换成非常量引用,并且仍然指向原来的对象;       

      常量对象被转换成非常量对象

4、将Const类型转化为非Const类型的方法 :略

const使用建议:

1、在参数中使用const应该使用引用或指针,而不是一般的对象实例;

2、const在成员函数中的三种用法(参数、返回值、函数)要很好的使用

       1)参数:const A& a:只要函数体内是只读,不会修改参数,又想提高效率,则常常使用const &

       2)返回值:不要轻易的将函数的返回值类型定为const,除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

       3)常函数:任何不会修改数据成员的函数都应该声明为const 类型。

### 回答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 对象。 ### 回答2const_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++中的一个强制类型转换符号,用于去除指针引用变量的constvolatile属性。 在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去除constvolatile属性应该是谨慎的行为,只有在确保被修改的变量实际上不会被修改的情况下才能使用。 综上所述,const_cast关键字在C++中用于去除指针引用变量的constvolatile属性,使其能够修改被const修饰的变量。但需要注意使用时的谨慎和合理性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值