zoukankan      html  css  js  c++  java
  • C++ 声明和定义

    备注:本人对C++理解较为浅薄,如果有不正确的地方请多多指教。

    C++ 声明和定义

            声明和定义最主要的区别是:声明不申请内存空间而定义申请内存空间。

    定义申请内存空间 这点需要...好像很多人这样理解 我怎么以为这有点问题

    这里有个简单的错误,尤其是对我以C#的情景来理解C++。

    头文件中的 int a;(全局变量这样写)在C++ 中是定义。这里有个情况是 如果 int a;在自定义的类型中,将不再是定义。因为其不占用内存。

    如果在函数体内,int a;这还是定义。

    需要说明的是变量的定义和初始化是2个概念,请不要理解为一个

    一般变量的定义和初始化为在一起。即 int a=10;特别注意对定义的变量不进行初始化就直接使用的话,会产生无法预知的情况。

    (这里有个情况:局部变量必须初始化才能用,全局变量如果没有初始化编译器会有默认值?类的字段的情况?与C#区别)

    在同一个作用域(这点该怎么说呢?),只能定义一次。

    一次定义规则:是指定义在所有进入连接的编译单元中只能有一次。

        我这里参考了Frank Fang中的C++中声明和定义的区别的博客内容

    声明和定义有几种情况需要理解

    1、在头文件中自定义类型,其实就是我们常说的自定义类  ( 这里的定义不分配内存空间 )

    上面定义的头文件中iceTreeNode类仅仅告诉编译器有定义类型,编译器仅对其进行语法分析以及名字的决议,并未占用内存空间。

    2、Extern关键字

         extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,Extern也可用来进行连接指定(dll)

         VS编译器是采用按文件编译的方式,因此在编译时,各个文件中的定义的全局变量是相互透明的,也就是说,在编译时候,全局变量的可见域限制在文件内部。

         连接阶段,各个文件的内容(实际是编译产生的obj文件)是被合并到一起的。因而,定义于某文件内的全局变量,在链接完成后,它的可见性范围被扩大到了整个程序。

          extern的原理很简单,就是告诉编译器 ,当前变量在其它文件中定义。

    extern 函数

            常见extern放在函数的前面成为函数声明的一部分。

    如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件中定义,没有其它作用。

    即:extern int f();和 int f();没有区别

    extern "C"

         C++ 环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败。

    C++ 语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称。

    而C语言则不会。因此会造成链接时找不到对应的函数的情况。此时C函数就需要用extern "C" 进行链接指定

    告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。

        被extern “C”修饰的变量和函数时按照C语言方式编译和链接的;

    C++ 支持函数重载,而过程式C则不支持,

    接下来:C++ 指针与引用 数组 string  字符串(重点) Void

               函数 参数传递引用 其实也是以赋值的方式 只不过这个值为地址 比较C#中

               C++ 模版 泛型编程理解

               C++ 继承 多态 虚函数 Static

               C++ 内存模型          

    模板函数的实例化(也就是在调用的时候),需要访问到模板函数的源代码(也就是定义代码,一般放在**.cpp中),也就是说在调用模板函数时需要include模板函数的

    静静的寻找属于自己的.....

  • 相关阅读:
    FreeCommander 学习手册
    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
    StringBuffer 详解 (String系列之3)
    StringBuilder 详解 (String系列之2)
    java io系列26之 RandomAccessFile
    java io系列25之 PrintWriter (字符打印输出流)
    java io系列24之 BufferedWriter(字符缓冲输出流)
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
  • 原文地址:https://www.cnblogs.com/renxs/p/2321086.html
Copyright © 2011-2022 走看看