C++学习-常量

常量

1.        值替代

l          为什么使用const代理 #define

例如:const int bufsize = 1000; const int bigbuf = bufsize*3;

#define A 3
#define B A+5
#defien C B*3
那么C为   A+5*3 = 18
类型检查 :const会进行类型检查,但 是#define不会检查类型

常数折叠 :上面的例子,如果使用宏定 义,所有使用bigbuf的地方都需要重新计算。但是使用const就不需要重新计算。

编译器产生的构造的符号表,当程序已经link 结束,这个数据字典就可以删除。
编译器在处理常量时,产生的数据字典如下,常量是不要分配内存的,在数据字典里直接放的就是值。
Bufsize const int 1000(不是地址,而直接是值)
Bigbuf const int 3000

l          地址分配

通常 并不分配空间而是存储在符号表中。
例如:const int bufsize = 100; int buf[bufsize]
但是 如果有取地址的操作,就为常量分配空间
例如:const int bufsize = 100; cont int * ip = &bufsize;
Const 用于集合,分配内存且不可以在编译时使用
例如: const int ia[] = {0, 1, 2}; int test[ia[2]]

Const int a = 100;
    Int b = 3;
    Int arr[b];  //有编译错误,编译器在给数组分配地址的时候,需要知道数组有多少元素。

原因在于编译器在符号表里,b的存放方式
b  int  address
所以编译器无法知道b的值,但是编译器在编译的 时候就需要知道数组的size。但是b的值在运行的时候才知道。

即使 const int bufsize = 100, const int *ip = &bufsize;
这时const int bufsize仍然可以用来声明数组。这是因为在符号表里存的不是地址,仍然是100.
*(int *p) = 3;  //强制修改P所指的值
Printf(%d, bufsize)  为100,证明 bufsize 在符号表里是100.
但是 printf(“%d”, *p) 为 3, 证明P所指的内存中数值已经改变了。

Java是个托管语言,是在虚拟器上运行的。C# = C++++

2.        指针

l          指向const的指针

例如 const int *x; int const *x
看 const离谁近。 Const 离int近,那么说整数是常量。
Cosnst *x, const 离*x,那么就是指针指向的值是常量。

l         const指针

例如: int d ; int *const x -= & d;
赋值

l          变量的地址可以赋给常量的指针; 反之不成立

例如:
int d = 1;
const int e = 2;
int *u = &d;
int *v = &e;        /*不可以,如果可以,那么就可以通过指针v任意修改const int e*/
int *w = (int *)&e;

特例:char *str = „Hello world“;

定义函数时 f(const int *p)
如果 是f(int *p),那么不能处理常量。例如:
Const int i = 100;
F(&i);  //会出错。不能处理常量

例子:定义一个数据类型,复数
Class Complex {
Int real;
Int virtual;

}
用法:  Complex a(1,3), b(3,6)
Complex c = a+b;  /可以理解为 a.+(&b),传的是b的地址
函数原型为 +(const Complex &a),必须有const。如果没有cosnt,那么就不能对常数进行加法。

3.        函数的参数和返回值

-传cosnt值 -- 函数创建者的工具而不是调用 者的工具;
-返回const,
对内部类型返回值是const或不是无区别,但是对用户自定义类型,
如果返回const值,则不可以作左值。

4.        传递和返回指针

-- 无论何时传一个地址,尽量用const 修饰


5. 类中的const问题

类中的 const成员恢复C中常量值的含义,对应于内存中一个不可更改的值。在类中建立const成员不可以给初值,而只能在构造函数的初始化表达式中初始化。

编译期间的类中的常量用枚举型enum表示。

 

运行时常量
class X{
      const int size;
Public:
      X();
};

X::X():size(100){}
编译时常量使用enum
class Dog{
      enum {size=1000; }
      int array[size];
      ……
};

l          const对象与const成员函数

  • 对const对象,公有的数据成员容易保证不 变,但是私有成员如何保证其不被其成员函数修改?  将成员函数设置成private的。
  • const成员函数除了类声明时要用const 修饰,函数定义时也要使用const修饰。这个const的含义是,声明传进成员函数的this指针是指向常量的指针。
  • const成员函数不可以修改属性的值,也不可以调用其它非const的成员函数。
  • 构造函数、析构函数不可以定义为const的。
  • 按位const与按成员const       mutable关键字
    可参考http://www.wangchao.net.cn/bbsdetail_31489.html

class X{
int i;
public:
f();
}
X x1, x2; //这两个实例所占的内存是8个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值