C++常量折叠和类中const、static成员变量初始化
2016-01-11 10:57
441 查看
1.常量折叠
定义:
常量折叠:是其中一种被很多现代编译器使用的编译器优化技术。常量折叠是在编译时间简单化常量表达的一个过程。简单来说就是将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
C++中用const修饰符定义常量a,该常量a从表面上看等同于C语言中#define定义的常量b,相同的地方:在预编译阶段,编译器会将a和b作用域内的符号为a和b替换为1;不同点是,C++中,会为a分配内存,将a存储在常量表中,然而,b将不会被分配内存存储,也就是在预编译后,符号b就不复存在。具体表现在程序上,有什么区别呢,看下面举例代码:
然而C代码却不行,因为b是不分配内存的,int *p=(int *)(&b);报错
2.C++类中static、const修饰的变量初始化
对于成员变量是const类型,两种方式初始化:
I.定义的时候,对变量初始化:const int a=0;
II.构造函数时,用参数初始化表对数成员初始化
对于成员变量是static类型,有两种方式初始化:
I.类外初始化,如下代码所示:
对于成员变量是const 和static类型的,只能够直接赋值:static const int a=0;
【注】如果有哪里不对或者不妥的地方,欢迎评论指正~
定义:
常量折叠:是其中一种被很多现代编译器使用的编译器优化技术。常量折叠是在编译时间简单化常量表达的一个过程。简单来说就是将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
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 1 int 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;
【注】如果有哪里不对或者不妥的地方,欢迎评论指正~