• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
小小松
学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
博客园    首页    新随笔       管理     
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模板函数的

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

学习技术不只是为养家糊口,也为夜深人静的时候能够一个人静静享受这其中的乐趣。
posted on 2012-01-12 22:41  小小松  阅读(3886)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3