您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-11 10:57 441 查看
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 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;

【注】如果有哪里不对或者不妥的地方,欢迎评论指正~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C-C++ 编程