C++常量折叠和类中const、static成员变量初始化

来源:互联网 发布:iphone高速摄影软件 编辑:程序博客网 时间:2024/06/08 23:03

1.常量折叠

定义:

常量折叠:是其中一种被很多现代编译器使用的编译器优化技术。常量折叠是在编译时间简单化常量表达的一个过程。简单来说就是将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。

const int a=1;//C++用法#define  b   1  //C用法</span>

C++中用const修饰符定义常量a,该常量a从表面上看等同于C语言中#define定义的常量b,相同的地方:在预编译阶段,编译器会将a和b作用域内的符号为a和b替换为1;不同点是,C++中,会为a分配内存,将a存储在常量表中,然而,b将不会被分配内存存储,也就是在预编译后,符号b就不复存在。具体表现在程序上,有什么区别呢,看下面举例代码:

const int a=1;//C++代码int *p=(int *)(&a);*p=2;cout<<"*p="<<*p<<",a="<<a<<endl;

#define b 1int main()//C代码{int *p=(int *)(&b);*p=2;printf("*p=%d,b=%d",*p,b);return 0;}
C++代码没问题,会正常输出*p=2,a=1

然而C代码却不行,因为b是不分配内存的,int *p=(int *)(&b);报错

2.C++类中static、const修饰的变量初始化

对于成员变量是const类型,两种方式初始化:

I.定义的时候,对变量初始化:const int a=0;

II.构造函数时,用参数初始化表对数成员初始化

class Time{private:const int a;//公有、私有、保护类型都可以public:Time(int c):a(c){} };

对于成员变量是static类型,有两种方式初始化:

I.类外初始化,如下代码所示:

class Time{private:static int b;//公有、私有、保护类型都可以public:Time(){} };int Time::b=0;
II.在构造函数时初始化,而且只能在函数中:

class Time{private:static int a;//公有、私有、保护类型都可以public:Time(int d){             b=d;        } };

对于成员变量是const 和static类型的,只能够直接赋值:static const int a=0;


【注】如果有哪里不对或者不妥的地方,欢迎评论指正~



1 0
原创粉丝点击