声明、定义本质的区别:有无内存的分配


1、声明:

    一般来说,身后名是加了 extern 关键字,比如:


extern int a; // 只是声明

    这个过程,是声明,告诉编译器,这个变量已经在别的地方定义过了,这个只做基本的声明,这个过程并没有为其分配内存。

2、定义:


int x; // 声明 + 定义

    完成了定义,事实上,定义就包含了声明,编译器会为其分配内存。

3、初始化:


int x = 10;

    初始化,定义的都以后分配了内存了,更别说是初始化了。

4、一步完成:


extern int pi = 3.14;

    一般完成了声明,定义,初始化,更当然是分配了内存。

5、本质的区别

    声明、定义、初始化、的本质的区别在于有无分配内存。显然,声明只是告诉了编译器存在这么一个变量或者函数的声明,只是告诉了编译存在这么一个函数而已,这个函数或者变量在其他的位置定义过了,所以在这个过程中没有为其再次分配内存;定义,则编译器会为其变量分配内存空间。初始化,则是完成了,为其分配的内存填指定的赋值而已。

6、理解

    声明理解为:普通的声明,告诉编译器这个变量是在其他的地方创建的对象。

    定义理解为:一个特殊的声明,会为声明的变量进行分配内存。

时间: 2024-11-02 00:12:49

声明、定义本质的区别:有无内存的分配的相关文章

javascript 函数的定义与参数的有无

一.函数定义 function fName(params){ statements; return somevalue;//可以省略 } 注意事项: 1.参数可有,可无.不定义参数,在调用参数时,也可以传入参数: 例如: 1 function add(){ 2 if(arguments.length==1){ 3 alert(arguments[0]); 4 }else if(arguments.length==2){ 5 alert(arguments[0] + arguments[1] );

surfaceView和View最本质的区别

surfaceView和View最本质的区别在于: surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面.那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞.那么将无法响应按键,触屏等消息.当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程.但这也带来了另外一个问题,就是事件同步.比如你触屏了一下,你需要surfaceView中 thread处理,一般就

javascript 用函数语句和表达式定义函数的区别详解

通常我们会看到以下两种定义函数的方式: // 函数语句 function fn(str) { console.log(str); }; // 表达式定义 var fnx=function(str) { console.log(str+ ' from fnx'); }; 两种方式都创建了新的函数对象, 但函数声明语句的函数名是一个变量名, 变量指向函数对象, 和通过var声明变量一样,函数定义语句中的函数被显示地提前到了脚本或函数的顶部, 因此它们在整个脚本和函数内都是可见的,但是使用var 表达

(转)c++模板函数声明定义分离编译错误详解

当我们声明和定义一个模板的时候,必须要让声明和定义放在一个文件里.否则编译器会报错. 这就是为什么boost的实现文件的后缀名是hpp了. 这其中的理由是什么呢?为什么会这样? 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文

C++头文件保护符和变量的声明定义

1.#ifndef #define #endif头文件保护符 在编译的过程中,每一个.cpp文件被看成一个单独的文件来编译成单独的编译单元,#ifndef 保证类的头文件在同一个.cpp文件中被多次引用后不会出现重定义问题. 注意:只是防止在同一个.cpp文件中被多次引用. 例子: // file1.h class file1 { }; // file2.h #include "file1.h" class file2 { }; // file3.h #include "fi

C++成员函数实现在类定义中与在类定义外的区别(Windows下直接使用g++)

在上篇文章<inline的另一用处>中,提到函数实现在类定义中与类定义外的区别. 现在先看个实验: a.cpp: [cpp] view plain copy #ifndef TEST_H #define TEST_H class A{ public: int fun(int x){ return (x*x+1000); } }; #endif void tt() { } b.cpp: [cpp] view plain copy class A{ public: int fun(int x);

函数——函数的两种声明方式:函数声明&amp;函数表达式的区别(未完待续。。。)

一.函数声明中函数名是必须的:函数表达式中则是可选的 //函数声明 function sum(a, b) { return a + b; } alert(sum(1, 2)); //函数表达式 /* var s = function sum(a, b) { return a + b; } alert(s(1, 2)); */ var s = function(a, b) { return a + b; } alert(s(1, 2)); //以上两种都可以 二.用函数声明定义的函数,函数可以在函

【实习记】2014-08-10(下)用宏来批量声明定义函数

(冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码. 之前写好的C实现代码debug后运行良好.之前的mysortlib.c中函数声明如下,接口完全是一样的. void _bubsort(int arr[], int len); void _bubsort_(int arr[], int len); void _isort(int arr[], int len); void _isort_(int arr[], int len); void _ssor

(转)Java 内存区域分配和垃圾回收(GC)机制

Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制.概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop