zoukankan      html  css  js  c++  java
  • c++中的声明与定义

        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,就会报错中断编译就会失败,所以申明的作用非常明显。

        不仅是跨文件中的对象使用需要申明,就是同一文件中申明也有很重要的作用,先看如下代码:

     1 int fun1()
     2 {
     3     return 1;
     4 }    
     5 
     6 int main()
     7 {
     8     fun1();
     9 
    10     fun2(); // 编译时这里会报错,显示该成员未申明
    11 }
    12 
    13 int fun2()
    14 {
    15     return 2;
    16 }

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

    1 int main()
    2 {
    3     fun1();
    4 
    5     int fun2(); // 该语句表示申明fun2函数
    6 
    7     fun2()
    8 }

        总而言之在不同文件中定义的共享对象在使用前一定要先声明在使用。在同一文件中使用对象之前还未出现定义语句的对象需要先先声在使用。同一文件中先定义后使用的对象不需要声明可直接使用.

  • 相关阅读:
    MySQL执行计划extra中的using index 和 using where using index 的区别
    Python + Apache Kylin 让数据分析更加简单!
    性能测试解读:Kyligence vs Spark SQL
    greenplum 表在各个节点数据的分布情况
    postgresql drop表后空间不释放
    PostgreSQL 查看表、索引等创建时间
    postgresql Kill掉正在执行的SQL语句
    linux ps命令查看最消耗CPU、内存的进程
    Linux shell
    TPC-H 下载参考
  • 原文地址:https://www.cnblogs.com/kingcat/p/2307426.html
Copyright © 2011-2022 走看看