C++中的声明与定义
转自:http://www.cnblogs.com/kingcat/archive/2011/12/30/2307426.html
C++是一种复杂的计算机语言,很多在现代高级语言中已经不需要程序员操心的事情(其实这些事情并没有消失而是由语言本身和运行环境替我们做了)在C++中还需要我们处处留意,以免你写的程序编译不通过或者留下潜在BUG。
了解C++的人知道它里面有两个术语:声明,定义 很多新出现的高级语言对二者的界面很模糊,申明==定义,但C++中二者不同,而且需要了解他们的概念,否则你的程序很可能无法编译通过,现在我们来了解一下他们。
定义:就是创建一个对象,并且为他非配对象资源,这个概念比较容易理解。比如说 int a = 1; stirng b("abcd"); 定义是必须的,如果没有定义就无法使用对象。而且同一对象(同一作用范围内的同名同类型)只能定义一次重复定义编译器会报错。
声明:告诉编译器有这个对象存在,并且可以使用,为了理解这个概念先说说C++的一些编码与编译机制。
C++标准允许将一个系统中得不同部分定义在多个文件中,通过INCLUDE合并在一起使用。那么也就允许头文件A中定义的全局A1对象可以被包含该头文件的源文件B使用,这个概念应该容易理解。在说一下C++的编译机制,C++编译时顺序编译内容的,也就是说编译器会一个一个编译文件,然后根据文件的包含关系再做连接,生成一个可执行文件,假设编译器先编译A文件,发现里面定义了A1对象,然后再编译B文件,发现里面使用了一个叫A1的对象,我们假设编译器可以编译通过这个过程没有问题。 但是C++可能会先编译B文件,发现里面有使用一个叫A1的变量,这个时候A文件还未编译,那么编译就会出错中断,如何才能解决这个问题呢,声明技术就出现了,在编译B时候随便还没有A1这个变量被定义,但是如果我先声明一下A1变量,那么就意味着我告诉编译器:系统中是有一给叫A1的变量存在的,请继续编译,编译器在此打个标签继续编译,等编译到A文件时发现了A1的定义,编译器就找到之前打过标签的A1,设置为这个变量是合法的,然后继续向下编译。假设编译器直到编译完所有文件都没有发现A1,就会报错中断编译就会失败,所以申明的作用非常明显。
不仅是跨文件中的对象使用需要申明,就是同一文件中申明也有很重要的作用,先看如下代码:

fun2();
{
;
}

错误很明显,那为什么会出这个错误呢,因为C++编译时顺序编译的,对文件内容页是从上到下做编译,当编译到主函数时发现fun1()调用,因为这个函数在主函数之前定义了所以正常通过,而fun2()函数此时还未定义,所以报错,解决办法很简单,在调用函数前声明一下就可以了:

fun1();
fun2()
}

总而言之在不同文件中定义的共享对象在使用前一定要先声明在使用。在同一文件中使用对象之前还未出现定义语句的对象需要先先声在使用。同一文件中先定义后使用的对象不需要声明可直接使用.
C++中的声明与定义的更多相关文章
- PHP中变量声明和定义的区别
先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...
- C/C++中的声明与定义
含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...
- C语言中的声明与定义的差别
1.对于以下的声明语句 int a; 假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...
- C++中复杂声明和定义的辨析
0x00 前言 c++中的复杂声明往往令人无法下手,经常使人搞错这到底声明的是一个指针还是指针函数.但其实c++对于复杂声明是遵循一定的规则的,叫做变量名—>右--左-右规则. 0x01 规则解 ...
- 在源文件(.c)和头文件(.h)中声明和定义的区别——C语言
最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 情形一:在源文件(.c)中 相信大部分读者对声明和定义的理解是 ...
- 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏
以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- 声明、定义 in C++
序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述: 1.需要建立存储空间的 ...
- 【转】变量的声明和定义,从C到编译原理到C++,再到Java
基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来 最早 ...
随机推荐
- HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件
HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件.它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的.为了容错,文件的所有数据块都会有副本.每个文件的数据块大小和副本 ...
- HTML中级教程 元标签
元标签对浏览器窗口中的内容不做任何事情,它们用在关于页面的像搜索引擎的归类目录信息中. 元标签meta可以使用尽可能多次如你所需,包括内容属性content(必须的).名称属性name和http-eq ...
- css position弹性盒子测试
总结: 1.利用样式height:100%设置div高度为全屏时候必须设置所有的父元素,但是父元素那么多,不可控,所以此法不可行: 2.设置父框架的padding为100px,div进行float,p ...
- hdu1015 Safecracker —— 回溯
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015 代码1: #include<stdio.h>//hdu1015 #include&l ...
- 侧方位停车想一次过,掌握边线30cm很重要!
侧方位停车要想一次过关,关键在于保持车身距离库边线30cm左右的距离.但是,往往有很多学员掌控不好这个距离,导致倒库时压线.那么,如何找准这个30cm呢?下面,小编就来教大家方法,赶紧学习吧! 侧方位 ...
- 关于AngularJs中监听事件及脏循环的理解
可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件. AngularJs中对于的监听事件会用到一个s ...
- #pragma once与#ifndef
都是为了避免同一个头文件被包含多次.在编译器对这两种方式都支持的情况下,区别很小. 方式一: #pragma once ...//这里放声明语句 方式二: #ifndef 宏名 #def 宏名 ... ...
- codeforces 460C. Present 解题报告
题目链接:http://codeforces.com/submissions/ywindysai 题目意思:有 n 朵花,每朵花都有一定的高度(第 i 朵花对应 ai),m 天之后要把这些花送给别人. ...
- 常规问题解决:File "/usr/bin/yum", line 30 及 File "/usr/libexec/urlgrabber-ext-down", line 28
在执行yum命令时忽然发现出现以下报错: # yum list File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ...
- Web前端行业的了解
即将从事Web前端的工作的 先对即将从事的行业有个了解. Web前端发展史: 第一个网页诞生于90年代初,早期的网页除了一些小图片和毫无布局可言的标题段落,其全由文字构成.然而随着时代的进步,互联网的 ...