C++_Const的使用(2)

3、与类有关的const

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

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

  1. class A      
  2. {        
  3. private:  
  4.     const int n;   //成员常量不能被修改       
  5. public:   
  6.     A(int x): n(x) //只能在初始化列表中赋值   
  7.     { } ;     
  8. }  
class A    
{      
private:
	const int n;   //成员常量不能被修改    
public: 
	A(int x): n(x) //只能在初始化列表中赋值
	{ } ;   
}

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

  1. class A  
  2. {  
  3. public:  
  4.     A()   
  5.     {}   
  6. private:   
  7.     static const int i; //注意必须是静态的!   
  8. };   
  9. const int A::i=3;  
class A
{
public:
	A() 
	{} 
private: 
	static const int i; //注意必须是静态的!
}; 
const int A::i=3;

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

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

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

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

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

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

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

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

说明:

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

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

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

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

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

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

代码:

const重载

  1. #include<iostream>   
  2. using namespace std;  
  3. class A  
  4. {  
  5. private:  
  6.     int a;  
  7.     const int b;  
  8. public:  
  9.     A(int i,int j):b(j)  
  10.     {  
  11.         a=i;  
  12.     }  
  13.     void print()  
  14.     {  
  15.         cout<<"非const函数"<<endl;  
  16.         cout<<a<<b<<endl;  
  17.     }  
  18.     void print ()const  
  19.     {  
  20.         cout<<"const函数"<<endl;  
  21.         cout<<a<<b<<endl;  
  22.     }  
  23. };  
  24. void main()  
  25. {  
  26.     A a(1,2);  
  27.     a.print(); //a为普通的对象,会调用普通的成员函数   
  28.     const A aa(3,4);  
  29.     aa.print();//aa为常对象,会调用常成员函数   
  30.     system("pause");  
  31. }  
#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重载>

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

  1. #include<iostream>   
  2. using namespace std;  
  3. class A  
  4. {  
  5. private:  
  6.     int a;  
  7.     const int b;  
  8. public:  
  9.     A(int i,int j):b(j)  
  10.     {  
  11.         a=i;  
  12.     }  
  13.     void print ()const  
  14.     {  
  15. //      a=10;//错误,常函数中不能更新数据成员   
  16.         cout<<"const函数"<<endl;  
  17.         cout<<a<<b<<endl;  
  18.     }  
  19.     void set(int i,int j)  
  20.     {  
  21.         a=i;  
  22. //      b=j;//错误,const成员不能改变   
  23.     }  
  24. };  
  25. void main()  
  26. {  
  27.     const A a(3,4);  
  28. //  a.set(5,6);//错误,常对象不能调用非常成员,常成员函数是常对象唯一对外出口   
  29.     a.print(); //正确,常对象只能调用常函数。   
  30.     system("pause");  
  31. }  
#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重载>

  1. class A  
  2. {  
  3.     void func1();  
  4.     void func2() const;  
  5. }   
  6. const A aObj;  
  7. aObj.func1(); //错误,常函数只能调用常成员函数   
  8. aObj.func2(); 正确  
  9. const A* aObj = new A();  
  10. aObj-> func1();//错误,常指针只能调用常成员函数   
  11. aObj-> func2(); 正确   
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 类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值