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

    目录

    1. 参考

      1. 《C++程序设计语言》4.9

      2. 《C++Primer》2.3.5

      3. http://bbs.csdn.net/topics/190026622

    2. 概念

      2.1 声明

                  声明用于向程序表明变量的类型名字。(引自参考2)

      2.2 定义

          变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义

    3. 对比

        定义声明声明大部分是定义,少数情况不是定义

     

    声明

    定义

    非定义

    定义

    是否可以出现多次

    是否有内存分配

    没有

    是否可以直接使用该变量

    不能

    是否知道它的构成

    不一定知道

    知道

    知道

       

      3.1 声明但不是定义的情况

          除了下面三种情况,声明全都是定义

                3.1.1 声明来自其他文件的非初始化变量

    extern int i; // 这是声明不是定义,变量i的定义在其他文件中

                         注意如果对来自其他文件的变量进行初始化,那么这就是定义

    extern int i = 10; // 这是声明且是定义 

                3.1.2 声明类型

    struct User; // 这是声明不是定义

                3.1.3 声明方法

    double _sqrt(double); // 这是声明不是定义

     

      3.2 声明且是定义的情况

    int i;
    char ch;
    string s;
    int count = 1;
    const double pi = 3.14;
    const char *name = "Njal";
    const char *season[] = {"spring", "summer", "fall", "winter"};
    struct Date { int d, m, y; };
    int day(Date *p) { return p->d; };
    template <typename T> T _abs(T a) { return a < 0 ? -a : a; }
    enum Beer { Carlsberg, Tuborg, Thor};
    namespace NS { int a; };

      

      3.3 特殊情况

        3.3.1 使用extern修饰变量,且初始化

    extern int i = 10; // 这是定义

        3.3.2 使用typedef

           这是个纠结的问题,我现在还没想明白,如果你知道请回复我,谢谢。

           C++的作者认为

    typedef comple<short> Point; // C++的作者认为这是定义

            但是对于这种情况呢?

    struct User; // 这是声明非定义 typedef User USER; // 这是不是定义呢?

         3.3.3 类定义中的成员变量

    struct Date 
    { 
        int y; // 这是定义 
    }

    下面是关于声明与定义的帖子的一个回复以及我的观点,读者可以参考。

    论坛上某人的回复如下。(引自参考3)

    1. 变量和对象不加extern永远是定义,类中的除外. 
    2. 函数只有函数头是声明,有函数体是定义. 
    3. 类永远只是声明.类成员函数的函数体是定义. 
    
    class C 
    {   
      static int x;//这里的x是声明   
      static const int a;;//这里的a是声明   
       //非static变量在类定义对象时才分配内存.  
        C();//这里的函数是声明
    }; 
    int C::x;//这个才是定义 
    const int C::a=11;//这个才是定义

     我的观点

    1. "变量和对象不加extern永远是定义"是片面的,例如特殊情况extern int i = 10就是定义。 
       "变量和对象不加extern永远是定义,类中的除外",我认为类中的变量和对象也是声明。 
    2. "函数只有函数头是声明,有函数体是定义.",我认为是正确的。
    3. "类永远只是声明.类成员函数的函数体是定义.",我认为类永远都是定义。 
    class C 
    {
       static int x;//这里的x是定义   
       static const int a;//这里的a是定义   
       C();//这里的函数是声明 
    }; 
    int C::x;//这个是初始化 
    const int C::a=11;//这个是初始化
  • 相关阅读:
    生成随机数的范围的公式
    正则匹配<img src="xxxxxx" alt="" />标签的相关写法
    js 日常问题记录
    css 三角实例
    /users/products.:format 这种写法的其对应解析字符写法
    package.json 的语法解释
    replace 全局替换 和 数组去空
    js checkbox获取选中的值
    JavaScript基础知识一
    移动 Web 设计
  • 原文地址:https://www.cnblogs.com/lovers/p/cpp_definition_decalartion.html
Copyright © 2011-2022 走看看