e夜星空
C++,你看重C还是++?
posts - 1,comments - 0,trackbacks - 0
在C++语言学习中有一个很经典的代码程序如下:

//
// 警告:本示例代码仅为演示C++的变量名覆盖问题,在实际编码中请勿采用。
// 请遵循良好的编码风格,勿在不同名空间声明同名的变量。
//
#include <stdio.h>

float demo_var = 2.0;   // declaration of global variable named as 'demo_var'

float foo();

int main(int argc, char **argv)
{
    printf("Global demo_var = %f.\n", demo_var);

    float demo_var = 888888.8;   // local variable in main() name as 'demo_var' also.

    float ret = foo();
    printf("The return value for foo() is : %f.\n", ret);

    printf("in main(): demo_var = %f, ::demo_var = %f.\n", demo_var, ::demo_var);

    return 0;
}

float foo()
{
    float demo_var = 99.99;   // auto variable in foo() with the name 'demo_var' too.
    printf("Local demo_var = %f, global demo_var = %f.\n", demo_var, ::demo_var);
    return demo_var;
}

我们看一下名为demo_var的变量前后共声明了3次,以蓝色字体显示。
1. 定义一个全局变量,名为demo_var,初值为2.0.程序运行时,该变量的内存地址在全局data段。
2. 在main函数中声明一个自动变量,名为demo_var,初值为888888.8。该变量内存地址在main函数栈中。
3. foo函数中声明一个自动变量,名为demo_var,初值为99.99。该变量内存地址在foo函数栈中。

再来看一下,这3个同名变量在程序运行过程中是何时创建的?
把代码编译成可运行程序,通过命令行(或其它方式)启动程序,
操作系统创建一个进程,先设定运行环境,此时全局变量(第1次定义)在data内存段被创建。
操作系统接着调用main()函数,
输出一个打印语句(因为main函数中的demo_var定义语句还没运行到,此行输出的是全局变量值)。
main()函数接着定义一个名为demo_var的局部自动变量(可以也应该取其它的变量名),这个变量在main函数栈中,main函数结束后将自动释放。

main函数调用foo函数,foo函数栈创建。
foo函数栈中创建一个变量,名为demo_var(同样可以也应该取别的名字),
打印语句认为demo_var是在foo函数栈定义的变量(因为它懒,不想跑到很远的data内存段读全局的demo_var,而main函数栈空间对它是不可见的),想要访问全局的demo_var,C++提供了全局空间操作符::
foo函数结束时返回demo_var(foo函数本地定义的)值给调用者。

main函数接着运行输出foo返回值的打印语句,
然后输出main函数定义的变量demo_var,同样输出全局的demo_var需要用到::
可以看到C++语言提供了命名空间来解决命名(函数名,变量名及类名等)冲突的问题,
不同的空间可以有同名的变量,但它们不是同一个实体,
对计算机程序而言,同一个实体指存在于同一个内存地址并且是具有相同的类型。

请用C++编译器编译该代码,绝大部分的C编译器并不能识别::运算符(C++的全局空间运算符)
程序编译运行结果如下:
Global demo_var = 2.000000.
Local demo_var = 99.989998, global demo_var = 2.000000.
The return value for foo() is : 99.989998.
in main(): demo_var = 888888.812500, ::demo_var = 2.000000.

posted on 2005-12-13 12:58 风之簸萝 阅读(788) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理