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

c++编程拾贝(二)

2016-03-22 02:44 246 查看

关于const那些事

晚上看c++编程思想,看到一些很有趣的东西,记录下来,在旁边的批注上写了两个大字,牛逼。

c和c++那些有数值但是不会放在内存区域的东西

c中,存在一种定义,他不会分配空间给这个变量,那就是预处理的define:

#define MAX 65536


例如上面的代码,作为一种文本替代的预处理,当然不会分配地址空间给MAX,而c++中更佳鼓励的方法是这样写一个“只在这里改,可以在全局用“的变量:

const int max = 65536;


这么做的原因主要在c中
define
预处理只是文本的替代,并不做类型检查,因此很容易发生问题。而c++这么做必需经过编译器的检查,因此更加安全些。

定义在需要用到的头文件处或者在全局区域定义,并且该值不会放在内存区域,只会放在它(max)的符号表里,但是有一个更意外的事情是,如果在其它头文件中用了如下:

extern const int max;


extern
关键字告诉编译器这个东西在别的地方,让编译器放行,在别的地方这个要求也强制要求了该max需要有一个地址(其实也就是说如果你对那个max取址的话也是会分配一块地址的),深夜看到这段话真是将栏杆拍遍。

常量折叠(constant folding)

来自thinking in c++的一个概念,指的是编译器对常量表达式的化简优化处理,即在有常量表达式的地方将常量表达式展开成最简的过程。上面的const类型的变量说是不会分配内存也是常量折叠搞的鬼啦。

因为难免要分配内存,因此const定义必须为内部连接(但是问题是c中const被引入的时候当作了外部连接),即连接仅在特定的编译单元内部,不会发生垮文件的连接问题,也即不会发生重定义的问题。

大部分的内建数据类型的情况,编译器都能执行常量折叠。

上面说到的c中的const是外部连接,举个例子就是:

const int num;


这在c中是合法的,它只是一个申明,指明在别的地方num会有定义,而在c++中这是非法的,一个const值必需在申明的时候就指定。

c中const是必需分配内存的,而c++就像上面说的,实际上一开始是不会分配内存的,只是存在字符表中.

下面看一段有趣的代码:

const int i = 100;
const int j = i + 10;
char buf[j] = { "a" };
for (int i = 0; i < j; ++i)
{
cout << buf[i] << endl;
}


另一段:

int i = 100;
const int j = i;
char buf[j] = { "a" };
for (int i = 0; i < j; ++i)
{
cout << buf[i] << endl;
}


第一段不会有问题,第二段编译器会报错的,我想如果有了上面的知识应该就会明白原因了。

当然,强制一个const成为外部连接让其它文件可以使用,那就强迫分配内存,像这样:

extern const int x = 1;


下面讲讲const 和 临时量

看一段代码,来自c++编程思想,今天有点晚了,明天我再详细讨论这个代码。

这是一段很有意思的代码,可挖掘的东西很多,就当是一个笔试挑错题吧~

Class X{
int i;
public:
X(int ii = 0);
void modify();
};

X::X(int ii){ i = ii;}

void X::modify(){ i++;}

X f5(){
return X();
}

const X f6(){
return X();
}

void f7(X& x){
x.modify();
}

int main(){
f5() = X(1);
f5().modify();
f7(f5());
f6() = X(1);
f6().modify();
f7(f6());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: