C和C++中的const关键字

(一)C和C++中的相同点

1.const 修饰指针
  const与一级指针结合
  int const *p;
  const int *p;---->p为常量指针 p指向的内容不可改 p的指向可以改
  int *const p;---->p为指针常量 p的指向不可改  指向的内容可改
  const int *const p---->p的指向和指向的内容都不可改
  const与二级指针结合 int a = 10;int *q = &a,int **p = &q;
  int** const p; --->p为指针常量,p的指向不可改(p只能指向q)
                                  **p 可以修改q所指的内容
                                   *p 可以修改q的指向
  int *const *p; --->p为常量指针,*p不可以  p指向的内容不可改(q里面保存的内容不可改)
                                  但是p的指向可以改
                                  **p 可以改变q所指向的内容
  const int **p; --->p为常量指针,**p不可以 不可以改变q指向的内容 
                                            p的指向可以改
                                            *p可以改(q的指向可以改)
2.const与函数形参的结合
const int* a; --->防止修改指针指向的内容
int* const a; --->防止修改指针指向的地址
const int &a; --->防止修改a的值 指向使用a 不想改变a的值
3.const与函数返回值结合
 (1)如果给以“指针形式”返回的函数返回值加const 
                     表示此函数返回的指针所指向的内容不可改 
                     并且应该以同类型指针接受返回值
 (2)如果给以“引用形式”返回的函数返回值加const
                     表示此函数的返回值不能做左值 即不能被修改

(二)不同点

c语言中的const
1.const 修饰变量 变为常变量  
   必须进行初始化  因为被const修饰的变量不能作左值被修改
   由于常变量本质还是变量 一个不确定的值 所以不能用来定义数组大小
   如果const修饰的变量是一个全局变量 这样可以防止不必要的人为修改 
           因为全局变量作用域为global 可以被同一工程的其他文件通过“extern”引用

c++中的const
1.const 修饰变量 变为常量 
        必须进行初始化  因为被const修饰的变量不能作左值被修改
        由于此时这个变量的本质变为一个常量 所以可以作为数组的大小

2.类中const的应用
 (1)const修饰成员变量 称为成员常量
    不能被修改  它只能在初始化列表中赋值

class A
	{
	  const int a;
	  int b;
	  A(int x,int y):a(x)
	  {
	     b = y;
	  }
	};

(2)const修饰成员函数 
       被const修饰的成员函数 不能修改类中的任何非const成员 一般写在函数后面来修饰

 class A
	   {
	     void fun() const;
	   };

 const成员函数不被允许修改它所在对象的任何一个数据成员
       const成员函数能够访问对象的const成员  而其他成员函数不可以
 (3)const修饰类对象/对象指针/对象引用
  const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。
         对象指针和对象引用也是一样。
  const修饰的对象,该对象的任何非const成员函数都不能被调用,
         因为任何非const成员函数会有修改成员变量的企图。
 (4)const类型转为非const类型
  采用const_cast<type> (expression); 该运算符用来修改类型的const或volatile属性
      常量指针被转化成非常量指针,并且仍然指向原来的对象; 
      常量引用被转换成非常量引用,并且仍然指向原来的对象;
      常量对象被转换成非常量对象。

#include <iostream>
using namespace std;

class A
{
public:
	A(int x,int y,int z):a(x)
	{
		 //a = x;//error  必须在初始化列表里赋值
		 b = y;
		 c = z;
	}

	void SHow()const
	{
		//const成员函数不被允许修改它所在对象的任何一个数据成员
		//a = 10;//error
		//b = 20;//error
		//const成员函数可以访问const成员变量和非const成员变量

		cout<<"A::const a = "<<a<<endl;
		cout<<"A::b = "<<b<<endl;
		cout<<"A::c = "<<c<<endl;
	}
	
	void Show()
	{
		cout<<"A::const a = "<<a<<endl;
		cout<<"A::b = "<<b<<endl;
		cout<<"A::c = "<<c<<endl;
	}
private:
	const int a;
	int b;
	int c;
};


int main()
{
	const  A a(1,2,3); //const A *this;从而保护this指向的内容不被随意修改
	A b(1,2,3);//A *this;
	 a.SHow();//const对象可以调用const成员函数
	// a.Show();//const对象不能调用任何非const成员函数  const A*this 不能转为 A *this 这属于权限扩大
	 b.SHow();//非const对象可以调用const成员函数 A *this  ---> const A*this 权限可以缩小
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值