C++常变量和文字常量

文字常量编译之后在代码区,不可寻址。

常变量可以寻址。

运行时常变量并不是放在只读内存中。而是和一般变量一样放在数据区。

所以运行时如果能够获得常变量的地址,一样可以通过特殊的途径对它们进行修改。

 1 #include<iostream>
 2 using namespace std;
 3 void ShowValue(const int & i){
 4     cout<<i<<endl;
 5 }
 6 int main(){
 7     const int j = 5;
 8     int *ptr;
 9     void * p=(void *)&j;
10     ptr = (int *)p;
11     (*ptr)++;
12     ShowValue(j);
13     cout<<j<<endl;
14 }
15 输出:
16     6
17     5

其实j已经是6   但是直接输出j时,编译器会有一定的优化,将j直接变成数字5进行输出。

const使用位置比较灵活:

一般来说,除了修饰一个类的成员函数外,const不会出现在一条语句的最后。

const int p 与 int const p 一样,放在类型之前之后都可以。

int const *p 与 int *const p 不相同,前者修饰int  后者修饰int * ,前者表示p指向的是只读int 整形量 但是p指针是可以修改的。后者表示指针p本身不能够修改。

int const *p :为常指针,指向常量的指针。

int *const p:为指针常量,指指针本身就是常量。

解释:

int const **P :  p所指向的类型为int const *(一个常指针,指向只读int整形常量)

int * const*p :p所指向的类型为int * const (一个指针常量)

所以以上两种赋值时,会有一定的讲究。

const对象和对象的const成员

const修饰的对象为常对象,而用const修饰的成员函数为常函数,在常函数中不能修改任何的成员变量。

通过常对象,只能调用常函数。

 1 #include<iostream>
 2 using namespace std;
 3 class A{
 4 private:
 5     int num;
 6 public:
 7     A(){num = 5;}
 8     void disp();
 9     void disp() const;
10     void set(int n){num = n;}
11
12 };
13 void A::disp()const{
14     cout<<"const disp()"<<endl;
15 }
16 void A::disp(){
17     cout<<"disp()"<<endl;
18 }
19 int main(){
20     A al;
21     al.set(3);
22     al.disp();
23     A const a2;
24     a2.disp();
25 }
26 输出的内容:
27 disp()
28 const disp()

用const修饰函数的参数和函数的返回值

目的是让程序更健壮

1、用const修饰函数的参数时,主要是将别引用的变量和对象声明为常量。

2.当函数返回的是一个普通数据,而不是引用时,用const修饰函数的返回值没有太大的意义。

常见的const误解:

1、用const修饰的变量的值一定是不能改变的,在一些特殊情况下,可能需要临时改变一下常变量的值,而且这也是可以做到的。

2、常引用或常指针,只能指向常变量。这也是一个极大的误解。引用被声明为常引用(或指针被声明为常量的指针),只能说明不能通过该引用(或该指针)去修改被引用对象(或被指向单元)的值。至于被引用对象原来是什么性质,或者是否会被其他引用修改,是无法由常引用(或常指针)来决定的。

时间: 2024-12-15 19:17:26

C++常变量和文字常量的相关文章

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

以下代码使用平台是Windows 64bits+VS2012. 在C/C++编程时,经常遇到以下几个概念:常量.文字常量.符号常量.字面常量.常变量.字符串常量和字符常量,网上博客资料也是千篇千律,不尽相同,弄得大家云里雾里.本文将尝试为大家捋清楚以上易混淆概念的定义,关系和区别. 常量指值不可改变的量.在C/C++中常量分为两种:文字常量(Literal constant)和常变量(constant variable). 文字常量和常变量的本质区别:文字常量编译之后存储在代码区,不可寻址,常变

常变量

常变量 在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量(constant variable).例如, const int a=3; //用const来声明这种变量的值不能改变,指定其值始终为3 在定义常变量时必须同时对它初始化(即指定其值),此后它的值不能再改变.常变量不能出现在赋值号的左边.例如上面一行不能写成 const int a; a=3; //常变量不能被赋值 可以用表达式对常变量初始化,如 const int b=3+6,c=3*cos(

c语言—栈区,堆区,全局区,文字常量区,程序代码区 详解

转:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.3.全局区(静态区)(static)-,全局

内存管理:栈区,堆区,全局区,文字常量区,程序代码区

一.预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变

转:计算机中栈区,堆区,静态存储区,文字常量存储区,代码区的详细解释

转:http://blog.csdn.net/dotneterbj/article/details/8021200 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事(数据结构中的堆是用数组模拟的),分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(

栈,堆,全局,文字常量,代码区总结

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka        在C\C++中,通常可以把内存理解为4个分区:栈.堆.全局/静态存储区和常量存储区.下面我们分别简单地介绍一下各自的特点. 一.   区域划分 堆: 是大家共有的空间,分全局堆和局部堆.全局堆就是所有没有分配的空间,局部堆就是用户分配的空间.堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏. 栈:是个线程独有

符号常量与常变量的区别

定义符号常量:#define PI 3.1415926               //注意后面没有分号 定义常变量  :const float PI=3.1415926: 区别: 常变量:变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的.而对于常变量,在变量的基础上加了一个限定:存储单元中的内容不允许变化,仍然是有存储单元的. 符号常量:是使用一个字符串代替程序中出现的一个标识符,是编译时把所有的符号常量都替换成制定的字符串,在内存中也不存在一符号常量命名

外部变量初始化与常量表达式

代码: #include <stdio.h> #include <stdlib.h> // 外部存储类(external storage class):具备文件作用域.外部链接和静态存储时期的类型 // 外部变量(external variable):具备外部存储类的变量 int a; // 外部变量如果不进行显式初始化,会被自动赋初值0 int b; int ages[10]; // 文件作用域变量只可用常量表达式初始化 // 只要不是变长数组,sizeof表达式就被认为是常量表

常指针和指向常量的指针和指向常量的常指针

(1)指向常量的指针:是一个指向的内容是常量的指针变量,const int *p=&x;不可修改*p的内容,但可以让指针p指向另一个地址,和int const *p一样 (2)常指针:int *const p=&x指针本身是个常量,固定指向某一变量,因此p不可变,但是*p可变 (3)指向常量的常指针:const int *const p=&x,指针p永远指向x,并且不能通过它修改它指向的地址的内容