C++/C 常量

转载 2013年12月03日 19:48:18

常用的常量可以分为:字面常量、符号常量、契约性常量、布尔常量、和枚举常量

1、字面常量

这种常量最为常见,例如直接出现的各种进制的数字、字符(‘’括住的单个字符)或者字符串(“”括住的一系列字符)等。实际上,只存在基本数据类型的字面 常量。

字面常量只能引用,不能修改,语言实现一般讲它保存在程序的符号表里,而不是一般的数据区中。符号表是“只读”的(这里不同于只读存储器,只是一种访问机制)。此外,初字符串以外,无法读取字面常量的地址。

例如 int *p = &5;                             //错误,不能读取字面常量的地址

         char *pChar   = "abdcef";       //正确,取字符串的地址。注意,这里不是给一个字符串变量,字符数组初始化

         char c[7]        = "abdcef";       //正确,一个字符数组初始化。

         *(pChar+2)= 'k';                 //错误,不能修改字面常量的内存单元

2、符号常量

存在两种符号常量:用#define定义的宏常量和用const定义的常量。由于#define是预编译伪指令,它定义的宏常量在进入编译阶段前就已经被替换为所代表的字面常量,因此宏常量在本质上是字面常量。

在c语言中,用const定义的常量其实是值不能修改的变量,因此会给它分配存储空间(外连接的);但是在c++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放到符号表中而不分配存储空间;而ADT/UDT(一个协议的参考实现)的const对象则需要分配内存空间(大对象)。还有一些情况也要分配存储空间,例如强制声明为extern的符号常量或者取符号常量的地址等操作,都将强迫编译器为这些常量分配内存空间,以满足用户需求。

可以对一个const常量取地址:对于基本数据类型的const 常量,编译器会重新在内存中创建一个它的拷贝,通过其地址访问的是这个拷贝而非原始的符号常量;而对于构造类型的const 常量,实际上它是编译时不允许修改的变量,因此如果能绕过编译器的静态类型安全检查机制,就可以在运行时修改其内存单元:

例如:

const long lng   = 10;

long *pl = (long*)&lng;                            //取常量的地址

*pl = 1000;                                             //迂回修改

cout<< *pl <<endl;                                  //1000,修改的拷贝的内容

cout<< lng<<endl;                                  //10,原始常量没有变

class Interger{

public:

        Interger():m_lng(100){}

        long m_lng;

}

const  Interger int_1;               

Interger *pInt = (Interger*)&int_l;            //去除常数属性

pInt->m_lng = 1000;                                   //迂回修改

cout<< pInt->m_lng <<endl;                       //1000,修改const对象

cout<< int_1.m_lng <<endl;                        //1000,迂回修改成功

3、契约性常量

用const修饰函数返回值,如果给“指针传递”的函数返回值加const那么函数返回值是一种契约性常量,不能直接被修改,并且该返回值只能被赋值给加const修饰的同类型指针(除非强制转型)。例如:

const char *GetString(void);

char *str = GetString();                         //错误;

const char* str = GetString();                //正确;

//=======================================================================

//测试环境 windowsxp,vc6.0

/*int Stringlength(const char *s)*/

#include<iostream>
#include <stdlib.h>

using namespace std;

int Stringlength(const char *s)
{

 cout<<s<<endl;     //输出值s并非字符串地址,而是字符串,注意C++/C默认char* 表示字符串
 if(s == NULL) exit(1);

 int length = 0;

 char *base = (char *)s;      //这里是将s的类型强制转换了,如果不强制转换应该为const char *base = s;

 while((*base++) != ' \0 ' )  length++;
 return length;
}
void main()
{
 char *ch = "Hello,c++ world!";     //取字符串常量的地址
 cout<<ch<<endl;                       //输出的是整个字符串
 cout<<*ch<<endl;                      //输出的是字符串的首个字符
 int len = Stringlength(ch);
 cout<<len<<endl;
}

C++/C 常量 - 默默 - zhaoweizhuanshuo 的博客

在“引用传递”时,也存在契约性常量:例如

void ReadValue(const int& num)

{

cout<<num;

int main()

{

      int n = 0;

      ReadVaule(n);           //契约性常量,n被看做是const

}


4,枚举常量

enum Gigantic

{

    SMALL = 10,

    GIGANTIC = 100000000

};

5、布尔常量

布尔常量只有两个 false和true,大小写不敏感。

总结:

        const与#define都可以用来定义常量,但是前者有更多优点:

(1)const有数据类型,而宏常量没有。编译器可以对前者进行静态安全检查;

(2)有些集成化调试工具可以对const常量进行调试,而对宏常量不可以

(3)被const修饰的东西都受到c++/c语言实现的静态安全检查机制的强制保护,可以预防以外修改。


http://zhaoweizhuanshuo.blog.163.com/blog/static/1480552622010425113746205/

C/C++中define定义的常量与const常量

常量是在程序中不能更改的量,在C/C++中有两种方式定义常量,一种是利用define宏定义的方式,一种是C++中新提出来的const型常变量,下面主要讨论它们之间的相关问题; define定义的常量...
  • lanuage
  • lanuage
  • 2016年02月28日 13:21
  • 2261

C/C++的数值常数后缀的使用总结

1.数值常数有:整型常数、浮点常数;   2.只有数值常数才有后缀说明;   3.数值常数后缀不区分字母大小写。   (1)整型常数的表示形式有:十进制形式、以0开头的八进制形式、以0x开头的十...
  • pizi0475
  • pizi0475
  • 2015年07月09日 21:47
  • 1285

C/C++中关于字符串数组与字符串常量

今天遇到了好多问题,从内存到字符串。。。上网查了些资料,现在就字符串数组和字符串常量来做个总结吧。其实也就是char  sz[] = "string"; 和char *psz = "string"; ...
  • code_bomber
  • code_bomber
  • 2007年11月01日 23:50
  • 7951

C/C++文字常量与常变量的概念与区别

在C/C++编程时,经常遇到以下几个概念:常量、文字常量、符号常量、字面常量、常变量、字符串常量和字符常量,网上博客资料也是千篇千律,不尽相同,弄得大家云里雾里。本文将尝试为大家捋清楚以上易混淆概念的...
  • K346K346
  • K346K346
  • 2015年06月10日 22:56
  • 4527

C/C++中的字面值常量、常量以及变量

1.字面值常量 在C/C++中,4、3.1415926、0x24、"BEIJING"等等,都称为字面值常量。称之为字面值是因为只能用它的值来称呼它,称为为常量是因为它的值不能被修改。举例说明: 20、...
  • wangjianno2
  • wangjianno2
  • 2016年10月03日 21:39
  • 195

c++常量引用

使用引用而非常量引用极大的限制了函数所能接受的实参的类型.因为我们不能把const对象字面值或者需要类型转换的对象传递给普通的引用形参.1、这种错误绝不像看起来这么简单,它可能造成出人意料的结果.例如...
  • drdairen
  • drdairen
  • 2016年11月16日 16:32
  • 933

C++ const常量成员函数

C++ 常量成员函数const的的用法太多了,常量成员函数就是曾经让我迷惑的用法之一,即在成员函数的参数列表之后加上const。...
  • zhangxiao93
  • zhangxiao93
  • 2016年01月28日 10:49
  • 866

C和C++中全局变量,局部变量,静态变量和常量

C/C++中常量,静态变量,全局变量和局部变量的区别和作用。把局部变量改变为静态局部变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态全局变量是改变了它的作用域, 限制了它的使用范围。...
  • zcyzsy
  • zcyzsy
  • 2016年08月14日 22:54
  • 1785

C/C++修改常量的值

C/C++中常量修饰const可以用来保证一些确定的量不会被一不小心改变,比如PI,一直是3.14159......但是不排除有时候也会需要修改常量的值,通过直接修改是不能达到目的。比如:#inclu...
  • CherylNatsu
  • CherylNatsu
  • 2011年03月25日 11:36
  • 4136

c/c++下修改字符串常量

请在(且只能在TC2.0)中运行下面代码,先不要看结果,想想会得到什么:     #include     #include         int     main(   int   argn,  ...
  • andylyc
  • andylyc
  • 2008年01月16日 09:00
  • 3789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++/C 常量
举报原因:
原因补充:

(最多只允许输入30个字)