C/C++中Static和Const的作用

    【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/53118850
一、const的作用 :
   const是C语言的一种关键字,它所限定的变量是不允许被改变的,从而起到保护的作用!const关键字可以用于修饰变量,参数,返回值,甚至函数体。const可以提高程序的健壮性,减少程序出错。
 (一)const用于定义常量和修饰变量
   当定义某个变量时,用const修饰,则该变量就变为常量,其值定义后就不能再改变了,如:const int x=1;常量x的值不能再改变了。
TYPE const ValueName = value;  //TYPE表示数据类型int、long、float等
const TYPE ValueName = value;  //TYPE表示数据类型int、long、float等
(1)const 修饰变量,表示该变量不能被修改。
  1、const char *p 表示指针p指向的内容不能改变
  2、char * const p,就是将P声明为常指针,它的地址不能改变。
  3、这种const指针是前两种的结合,使得指向的内容和地址都不能发生变化.

const double pi = 3.14159;//pi是常数
const double *const pi_ptr = π

(二)const修饰函数形式参数
  (1)传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var); 

(2)参数指针所指的内容为常量不可变

void function(const char* Var);  

(3)参数指针本身为常量不可变(也无意义,因为char* Var也是形参)

void function(char* const Var); 

(4)参数为引用,为了增加效率同时防止修改。修饰引用参数时:

void function(const Class& Var); //引用参数在函数内不可以改变
void function(const TYPE& Var); //引用参数在函数内为常量不可变

当输入参数为用户自定义类型和抽象数据类型时,将“值传递”改为“const&传递”可以提高效率,可以比较如下的代码:

void fun(A a);
void fun(A const& a);

第一个函数效率较低,函数体内产生A类型的临时对象用于“值传递”参数a,而临时对象的构造、复制、析构过程都需要消耗资源和时间的,但使用第二种方式,按“引用传递”不需要产生临时对象,省了临时对象的构造、复制、析构的过程,因此效率较高。而之所以用const修饰a,是为了保证引用a不被修改。

 (二)const修饰函数返回值
 (1)函数按const指针返回,表示该指针不能被改动,只能把该指针赋给const修饰的同类型指针变量。
const char *GetChar(void){};
char*ch=GetChar();//错误,按指针返回时,该函数返回值只能被赋值给const修饰的同类型指针
const char *ch=GetChar();//正确

(2)函数按值返回,函数会把返回值赋给外部临时变量,用const无意义!不管是内部还是非内部数据类型。

int const get(){return this->n;}
int temp=i.get();//正确,按值传递时,接受返回值有无const均可

(3)函数采用引用方式返回的场合不多,只出现在类的赋值函数中,目的是为了实现链式表达。
  (三)const修饰类的成员函数(函数定义体):

    通常,任何不需要修改数据成员的函数都应该声明为const类型,这样,如果const成员函数修改了数据成员或者调用了其他函数修改数据成员,编译器都将报错!

class stack
{
public:int GetCount(void) const ;
private:int m_num;
};
int stack::GetCount(void) const
{m_num++;
}

编译器输出错误信息:error C2166: l-value specifies const object。

例题:给定声明 const char * const * pp; 下列操作或说明正确的是?
  A.pp++
  B.(*pp)++
  C.(**pp) = \\c\\;
  D.以上都不对
  正确答案: A  
【详细解释】:const 限定一个对象为只读属性。 
    分析的原则:

    char const *ptr:若const限定符在*之前,则const限定的是*ptr。也就是说,ptr可以改变其所指向的对象,但不能通过该指针修改其所指向对象的值。
    若const限定符在*之后,则const限定的是ptr而不限定*ptr。也就是说,ptr不可以改变其所指向的对象,但能通过该指针修改其所指向对象的值。
若在*之前有const限定符且在*之后也有const限定符,则ptr与*ptr都被限定。也就是说,ptr既不可以改变其所指向的对象,也不能通过该指针修改其所指向对象的值。先从一级指针说起吧: 

(1)const char p  //限定变量p为只读。这样如p=2这样的赋值操作就是错误的。 
(2)const char *p  //p为一个指向char类型的指针,const只限定p指向的对象为只读。这样,p=&a或  p++等操作都是合法的,但如*p=4这样的操作就错了,因为企图改写这个已经被限定为只读属性的对象。 (const 限定*p,即限定p指向的内容)
(3)char *const p  限定此指针为只读,这样p=&a或  p++等操作都是不合法的。而*p=3这样的操作合法,因为并没有限定其最终对象为只读。 (const直接与p结合,因此这里只限定了指针本身p,但内容可以修改 )
(4)const char *const p 两者皆限定为只读,不能改写。 (结合方向:const char *(const p))
   有了以上的对比,再来看二级指针问题: 
(1)const char **p  p为一个指向指针的指针,const限定其最终对象为只读,显然这最终对象也是为char类型的变量。故像**p=3这样的赋值是错误的,而像*p=? p++这样的操作合法。 
(2)const char * const *p 限定最终对象和 p指向的指针为只读。这样 *p=?的操作也是错的。 
(3)const char * const * const p 全部限定为只读,都不可以改写。

C/C++中Static和Const的作用相关推荐

  1. 理解PHP5中static和const关键字

    PHP5中加入了很多面向对象的思想,PHP5的面向对象比较接近Java的面向对象思想.我们这里对PHP5中的static和const关键字作用进行一下描述,希望对学习PHP5的朋友有帮助. (1) s ...

  2. 类中static、const、readonly、partial修饰符

    static 修饰类成员: static在C#中的用法与C++类似,当声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个静态成员的副本,static变量可在成员函数或类的定义外部进行 ...

  3. Java中static修饰符的作用

    近日在做网络通信服务器和客户端的Java语言开发,碰到了获取客户端长连接Channel对象,利用唯一对象Client的获取方法getSingleClientInstance(),以为可以得到,但是显示 ...

  4. C++中static与const成员

    一.static成员 (1)static数据成员 static数据成员的创建是为了对象之间的共享和沟通,具有以下特点: 1.1 static数据成员属于类,只占一份空间(不像普通数据成员每个对象中都有 ...

  5. Java中static关键字的作用与用法

    一.static关键字的特点: static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能. 1. static修饰成员方法 static修饰的方法一般 ...

  6. c语言中{的作用,C语言中Static和Const关键字的作用

    C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...

  7. C C++中关于全局变量静态变量,extern,static,const的区别与总结

    一.extern 1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也 ...

  8. 关键字static、const、volatile的作用

    关键字static的作用是什么?这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1.在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2. 在模 ...

  9. IOS 本地推送 IOS10.0以上 static的作用 const的作用

    //需要在AppDelegate里面启动APP的函数 加上 UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNot ...

最新文章

  1. python数据分析及展示(一)
  2. typedef VS #define —— C语言中的 关键字 与 C指令
  3. tcpdump 识别成dns_1.6.3 使用tcpdump观察DNS通信过程
  4. 构建ASP.NET网站十大必备工具
  5. Sqlite3 数据库基本操作
  6. 适配iOS10以及Xcode8
  7. python操作Access .mdb数据库环境配置
  8. 【线段树求逆序数】【HDU1394】Minimum Inversion Number
  9. 物联网智能家居与射频识别技术应用
  10. 班德瑞1-9,神秘园1-4全集下载
  11. 【Laravel系列4.4】模型Eloquent ORM的使用(二)
  12. 文远知行杯广东工业大学第十六届程序设计竞赛 E爬塔
  13. 微信小程序别踩白方块(有效果图)
  14. 中国人的英文名和外国人的中文名
  15. PS中的画笔工具和修饰模式(画笔模式)
  16. 深度学习基础:2.最小二乘法
  17. 决定高薪的细节守则 zz
  18. mdb java_java从mdb文件中读出数据
  19. 一言 源码 android,Android - 一言的简单实现
  20. ZT android -- 蓝牙 bluetooth (四)OPP文件传输

热门文章

  1. 设定自动获得DNS服务器地址
  2. WebSphere Application Server v6中的问题诊断以及日志策略
  3. Android开发:shape和selector和layer-list的(详细说明)
  4. HDU 4912 Paths on the tree(LCA+贪心)
  5. inux读取ISO文件或是光驱的方法--挂载
  6. Java 之文件目录操作
  7. 2011年中国民营企业500强名单,广东仅13家浙江180家江苏130家
  8. memcache的深度解析(转)
  9. Symbian签名和Uid相关内容的整理(一)
  10. One Bug of WatiN?