primer c++ 第二章总结

来源:互联网 发布:xp开启80端口 cmd 编辑:程序博客网 时间:2024/06/05 04:54

P39, 左值和右值,书上说左值可以出现在等式的左边或右边,右值只能出现在等式的右边。我的理解是如果变量的存储位置是只读的,那就认为是右值,如果是可读可写的,那就认为是左值。一个常量只能是右值,普通变量是左值,函数返回值也只能是右值。


P42,初始化,书上说直接初始化就是把初始化式子放在括号中,复制初始化用等号,而且直接初始化的效率更高,这一点暂时无法理解。比如

int main(){    int di(0xff);    return 0;}
翻译成汇编是这样的:

08048544 <main>: 8048544:55                   push   %ebp 8048545:89 e5                mov    %esp,%ebp 8048547:83 ec 10             sub    $0x10,%esp 804854a:c7 45 fc ff 00 00 00 movl   $0xff,-0x4(%ebp) 8048551:b8 00 00 00 00       mov    $0x0,%eax 8048556:c9                   leave   8048557:c3                   ret    

这里是个立即数。

int ci = 0xff;

它的汇编代码也是一样的。

再看

int ci = 0xff;int cci = ci;
它的汇编是这样的

08048544 <main>: 8048544:55                   push   %ebp 8048545:89 e5                mov    %esp,%ebp 8048547:83 ec 10             sub    $0x10,%esp 804854a:c7 45 f8 ff 00 00 00 movl   $0xff,-0x8(%ebp) 8048551:8b 45 f8             mov    -0x8(%ebp),%eax 8048554:89 45 fc             mov    %eax,-0x4(%ebp) 8048557:b8 00 00 00 00       mov    $0x0,%eax 804855c:c9                   leave   804855d:c3                   ret    

int di(0xff);int ddi(di);
汇编出来也是一样的。可能复杂一点的非内置类型的初始化不一样吧。

关于初始化和赋值的区别,初始化只一次,赋值可多次,而且会覆盖内存中原有的东西。


P49

1、非const的全局变量默认是extern的

2、const的全局变量,默认是static,如果需要外部文件访问,必须显示制定为extern。

    非const的变量也可以显示的写成 extern int a_int = 20; 不过这样没多大意义,而且会得到一个警告。

3、extern声明的变量,与普通变量,只能定义一次

//a.cpp

extern int a_int = 20;

//b.cpp

extern int a_int = 20; //error, 在a.cpp中已经有过定义


原创粉丝点击