概述

1. const有什么用途?

  • 在 c程序中,const的用法主要有定义常量、修饰函数参数、修饰函数返回值等3个用处。
  • 在c++程序中,它还可以修饰函数的定义体,定义类中某个成员为常态函数,即不改变类中的数据成员。
  • 被const修改的东西都要受到强制保护,可以预防意外的变动,能提高程序的健壮性。

2. const与#define相比有什么不同?

它们都可以用来定义常量,但const比#define有更多优点:

(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误(边际效应)。

(2) 在c++中使用const常量而不使用宏常量,即const常量完全取代宏常量。

C++中的const

一、一般常量和对象常量

1. 一般常量

  一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。如:

int const x=;
  或
  const int x=;

定义或说明一个常数组可采用如下格式:

<类型说明符> const <数组名>[<大小>]…
//或者
const <类型说明符> <数组名>[<大小>]…
//例如:
  int const a[]={, , , , };

2. 常对象

  常对象是指对象常量,定义格式如下:

<类名> const <对象名>
//或者
const <类名> <对象名>

 定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符const可以放在类名后面,也可以放在类名前面。

二,常指针和常引用

1. 常指针

  使用const修饰指针时,由于const的位置不同,而含意不同。如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。下面举两个例子,说明它们的区别。 
   
  下面定义的一个指向字符串的常量指针:

 char * const prt1 = stringprt1; 

  其中,ptr1是一个常量指针。因此,下面赋值是非法的。

 ptr1 = stringprt2; 

  而下面的赋值是合法的:

  *ptr1 = "m";

  下面定义了一个指向字符串常量的指针:

 const * ptr2 = stringprt1; 

  其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,

  *ptr2 = "x"; 

  是非法的,而:

 ptr2 = stringptr2; 

  是合法的。 
  所以,在使用const修饰指针时,应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时,const修饰符的位置不同,前者const放在*和指针名之间,后者const放在类型说明符前。

2. 常引用

  使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下:

 const <类型说明符> & <引用名> 

  例如:

 const double & v; 

  在实际应用中,常指针和常引用往往用来作函数的形参,这样的参数称为常参数。 
  在c++面向对象的程序设计中,指针和引用使用得较多,其中使用const修饰的常指针和常引用用得更多。使用常参数则表明该函数不会更新某个参数所指向或所引用的对象,这样,在参数传递过程中就不需要执行拷贝初始化构造函数,这将会改善程序的运行效率。 
  下面举一例子说明常指针作函数参数的作法。

#include <iostream>
using namespace std; const int n = ;
void print(const int *p, int n); void main() {
int array[n]; //数组定义必须使用常量
for (int i=; i<n;i++) //输入六个数
cin>>array[i];
print(array, n); //输出六个数
}
void print(const int *p, int n) //表示p指向的内容不可修改,p本身可以修改
{
cout<<"{"<<*p;
for (int i=; i<n;i++)
cout<<","<<*(p+i);
cout<<"}"<<endl;
}

三,常成员函数

  使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说明格式如下:

<类型说明符> <函数名> (<参数表>) const; 

本质: 成员函数的第一个参数是const this指针,const修饰的成员函数的第一个参数是const T *this。 
其中,const是加在函数说明后面的类型修饰符,它是函数类型的一个组成部分,因此,在函数实现部分也要带const关键字。下面举一例子说明常成员函数的特征。

#include <iostream>
using namespace std; class r
{
public:
r(int a, int b):r1(a),r2(b) {}
void print();
void print() const;
private:
int r1, r2;
}; void r::print()
{
cout<<r1<<","<<r2<<endl;
} void r::print() const
{
cout<<"const: "<<r1<<","<<r2<<endl;
} void main()
{
r a(, );
a.print();
const r b(, );
b.print();
}

该例子的输出结果为: 5,4  const:20,52  

该程序的类声明了两个成员函数,其类型是不同的(其实就是重载成员函数)。 
有带const修饰符的成员函数处理const常量,这也体现出函数重载的特点。

四,常数据成员  

类型修饰符const不仅可以说明成员函数,也可以说明数据成员。  

由于const类型对象必须被初始化,并且不能更新,因此,在类中说明了const数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。  

下面通过一个例子讲述使用成员初始化列表来生成构造函数。

#include <iostream>
using namespace std;
class T
{
public:
T(int i);
void print();
const int &r;
private:
const int a;
static const int b=;//静态常量初始化可以在类内,也可以在类外
};
//const int T::b=20; //也可以在类外,但是只能初始化一次
T::T(int i):a(i),r(a) //必须在初始化列表中给常量初始化,但是不能初始化静态常量
{
//a=i; //这里不可以
}
void T::print()
{
cout<<r<<":"<<b<<":"<<a<<endl;
}
void main()
{
T a1(), a2();
a1.print();
a2.print();
}

该程序的运行结果为:100:10:100  0:10:0 
在该程序中,说明了如下三个常类型数据成员:

  const int & r;
  const int a;
  static const int b;

其中,r是常int型引用,a是常int型变量,b是静态常int型变量。程序中对静态数据成员b进行初始化。值得注意的是构造函数的格式如下所示:

a(int i):a(i),r(a)
  {
  }

其中,冒号后边是一个数据成员初始化列表,它包含两个初始化项,用逗号进行了分隔,因为数据成员a和r都是常类型的,需要采用初始化格式。

本文转自:博客

c/c++ const 用法的更多相关文章

  1. c++ const用法小结

    const用法 1,定义全局变量的内存分配问题 #define  Pi_1  3.14       //使用#define宏 const double Pi_2 = 3.14    //使用const ...

  2. const用法

    一.const作用 二.const用法 1.修饰一般常量   修饰符const可以用在类型说明符前,也可以用在类型说明符后. 例如: ; ; 2.修饰常数组  修饰符const可以用在类型说明符前,也 ...

  3. 【转】话说C语言const用法

    原文:话说C语言const用法 const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修 ...

  4. static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

    一.static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝  C++ Code  1 2 3 4 5 6 7 8 9 10 11 ...

  5. const用法详解(转)

    http://www.cnblogs.com/StudyRush/archive/2010/10/06/1844690.html 面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也 ...

  6. C++之常指针,指针常量,函数指针,const用法总结

    1.const char *p,char const *p,char * const p 对于C++而言,没有const * 修饰符,所以,const只可以修饰类型或者变量名.因而const char ...

  7. C++的那些事:const用法面面观

    一.const是什么 在 C/C++ 语言中,const关键字是一种修饰符.所谓“修饰符”,就是在编译器进行编译的过程中,给编译器一些“要求”或“提示”,但修饰符本身,并不产生任何实际代码.就 con ...

  8. 【三支火把】---C语言const用法总结

    C语言关键字const相信对于不少C语言新手是既陌生又熟悉的,好像经常见,但是却不知道为何用,怎么用?学习至此,总结一下const的用法,使用程序来帮助你理解该关键字,希望能帮到像我一样的新手. 我看 ...

  9. typedef,static,const用法

    一.typedef主要功能是定义一个已存在类型的别名,但是和宏并存 宏与typedef区别 1.宏定义只是简单的字符串替换 2.typedef定义的类型是类型的别名,typedef后面是一个整体声明, ...

  10. C++中const用法详解

    本文主要内容来自CSDN论坛: http://bbs.csdn.net/topics/310007610 我做了下面几点补充. 补充: 1. 用const声明全局变量时, 该变量仅在本文件内可见, 类 ...

随机推荐

  1. 面试问题总结二(技术能力-PHP)----Ⅰ

    1.你都做过什么项目? 答:第一份实习工作接触的项目是CRM 销售管理系统,一款用JSP语言开发的进销存管理系统.第一份正式工作是一款主打高质量图片社交社区网站项目,“美啦周末”(后改型为”聊会儿”) ...

  2. EasyUseCase 一款脑图转化 Excel 测试用例工具 (1.2 版本升级)

    EasyUseCase 本工具由本人自主开发.经过内部实践有效提升测试用例编写效率200% 覆盖率可度量.利用读取xmind软件图表转换符合国人基本需求的测试用例,让手动写Excel用例的日子过去,发 ...

  3. 一个flume agent异常的解决过程记录

    今天在使用flume agent的时候,遇到了一个异常,  现把解决的过程记录如下: 问题的背景: 我使用flume agent 来接收从storm topology发送下来的accesslog , ...

  4. 安装Zookeeper出现Unable to start AdminServer,existing abnormally问题解决方法

    问题如下: 出现这个问题主要是由于8080端口占用,可在zoo.cfg中增加admin.serverPort=没有被占用的端口号解决问题.

  5. 把打印的内容保存成文件(PDF)

    有时候网页的内容和打印的内容会有一些差异,需要把打印的内容倒出来.是有办法的. 1.以谷歌为内核的浏览器示例,按Ctrl+p快捷键打开打印对话框,如图: 2.点击更改按钮,更改打印机,会出现选择目标打 ...

  6. jQueryEasyUI的使用

    easyUI是一个基于jQuery的前端框架,如果想要使用easyUI就需要先导入easyUI的一些js文件和样式文件(本地化的JS文件可以自己选择是否导入),导入方式如下: 其中必须首先导入jQue ...

  7. Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用

    前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...

  8. 【ActiveMQ】- 发布/订阅模式

    publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...

  9. 学习Spring Boot:(八)Mybatis使用分页插件PageHelper

    首先Mybqtis可以通过SQL 的方式实现分页很简单,只要在查询SQL 后面加上limit #{currIndex} , #{pageSize}就可以了. 本文主要介绍使用拦截器的方式实现分页. 实 ...

  10. Apache Commons IO之FileUtils的常用方法

    Apache Commons IO 在学习io流的时候研究(翻译)了一下这个,只有FileUtils的某些方法,并不全面,还请谅解 org.apache.commons.io 这个包下定义了基于 st ...