• c++类定义代码的分离


    类文件

    实际工程中,对一个类的说明、架构、描述方法是:    往往分成头文件和实现的源文件,来实现代码的分离

      然后,源文件中包含类的头文件...

    头文件的包含问题:

      类对应的实现文件cpp、main主函数文件,都要包含类的头文件,因为要“单独”编译;

      main函数、其他文件要使用这个类的时候,都只需要包含该类的头文件足矣( 使用时、“编译”时, 无非是引用该

      类的成员和方法),而这些成员和方法已经在头文件中声明(或定义了);

      至于具体的实现代码,在链接的时候,是由linker “自动“  寻找该类对应的源文件cpp, 过程我们不必关心.

    头文件

    头文件的所有内容,都必须包含在

    #ifndef {Filename}
    #define {Filename}

    //{Content of head file}

    #endif

    这样才能保证头文件被多个其他文件引用(include)时,内部的数据不会被多次定义而造成错误

    inline限定符

    在头文件中,可以对函数用inline限定符来告知编译器,这段函数非常的简单,可以直接“ 嵌入“ 到调用定义之处。

    当然inline的函数并不一定会被编译器作为inline来实现,如果函数过于复杂,编译器也会拒绝inline。

    因此简单说来,代码最好短到只有3-5行的才作为inline。有循环,分支,递归的函数都不要用做inline。

    对于在类定义内定义实现的函数,编译器自动当做有inline请求(也是不一定inline的)。

    函数成员

    函数成员无论是否带有static限定符,其申明都放在.h文件的类定义内部。

    对于要inline的函数成员其定义放在.h文件;其他函数的实现都放在.cpp文件中。

    数据成员

    数据成员的申明与定义都是放在.h文件的类定义内部。对于数据类型,关键问题是其初始化要放在什么地方进行。

    对于只含有static限定符的数据成员,它的初始化要放在.cpp文件中。因为它是所有类对象共有的,因此必须对它做合适的初始化。

    对于只含有const限定符的数据成员,它的初始化只能在构造函数的初始化列表中完成。因为它是一经初始化就不能重新赋值,因此它也必须进行合适的初始化。

    对于既含有static限定符,又含有const限定符的数据成员,它的初始化和定义同时进行。它也是必须进行合适的初始化

    对于既没有static限定符,又没有const限定符的数据成员,它的值只针对本对象可以随意修改,因此我们并不在意它的初始化什么时候进行。

    模板的定义

    因为模板的这种特殊性,它并没有自己的准确定义,因此我们不能把它放在.cpp文件中,而要把他们全部放在.h文件中进行书写。这也是为了在模板具体化的时候,能够让编译器可以找到模板的所有定义在哪里,以便真正的定义方法。

    类定义语句

    类定义是一种类型定义语句,后面要加分号,这里的{ }跟if,for等语法结构中的大括号不同

    一开始写class clsName的时候就在{ }后面加上;分号

    类里面的static,const修饰符

      1. 类的成员函数

        static修饰成员函数,表示:该成员函数逻辑上属于类;而且表示它只能操作静态数据成员、全局变量、自己的参数,

          由于属于类, 没有this指针, 所以它不会去操作   “非静态“  : 数据成员: 非静态成员函数(“非静态”的东西,必须要具体的对象、this去调用)

        const修饰成员函数:表示:该成员函数不会修改类对象的非静态数据成员

        **** 对于类的成员函数而言,  static和const是不能同时修饰类的成员函数的: 因为const函数隐含包含一个实例指针:const this * , 这与static相矛盾 ***********

      2. 类的数据成员

           static成员的作用类似于global变量,但要优于全局变量

        2.1    static类成员变量,在类的内部叫 “声明”(static表示声明),在类的外部A::a=1; 叫赋值, 要定义必须加类型和赋值:int A::a=1; 这个才叫做定义

            ,这时不能加static,因为现在是定义而不是声明了

        2.2   const类成员变量,只能在类的构造函数的初始化列表中初始化(只是对某个具体的对象而言,恒定不变)

        2.3    要想在整个类中都建立恒定的常量,得使用: static const int a; = == == = =const static int a; (const, static 的位置不限), 它的定义跟2.1类似:

             cpp文件中: const  int A::a=1; (同样的,不要加static)

            ----;或者使用枚举常量:

    • class Test  
    • {  
    • public:  
    •       Test():a(0){}  
    •       enum {size1=100,size2=200}; 

        2.4   只有一类数据成员可以在类中初始化:静态整型成员常量(整型并不只有int,char等也是)

    static const int a = 0; //Ok
    static const char b = 0; //Ok
    static const double c = 0; //Error

    static const double d; //在类的定义(.h文件中)中声明一个变量
    static const double d = 0; //在类的成员的定义中(.cpp文件中)定义在.h中声明的静态成员常量
    还有一些规则可能因编译器不同而有所不同

    static的五种含义

     static的第一种含义:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。

       static的第三种含义:修饰全局函数时,表明该函数只在同一文件中调用。    ==与extern相反

       static的第二种含义:修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
     
       static的第四种含义:修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
       static的第五种含义:修饰类成员函数,表明静态成员函数

    全局变量

    全局变量是指文件中,定义在函数,类/结构外面的变量。目的是为了让多个函数和类都可以使用这个变量

    分为:

    普通全局变量,它的作用域是面向整个程序域的,面向项目中的所有文件的,在链接阶段,全局变量对所有的文件都是可见的:

      注意它不需要加任何修饰符(默认的全局变量,就是面向整个程序域的);

    staitic全局变量,它的作用域被限定在本文件中,只能为这个文件中的所以函数和类使用

    exten的作用:

      与C组合使用,extern C..., 表示c++项目按C语言的风格进行编译(包括参数的传递顺序,编译生成函数的名称...)

      第二种是,“只是一个声明”,声明当前文件中使用的这个变量是一个外部变量,我不用去定义它,但是在其他的文件有定义,当前可以大胆的使用,

        不能全都是extern,必须要有一个实际的文件中,进行这个变量的定义,否则在链接的时候,就不能实现当初的“承诺”而报错

     http://www.cnblogs.com/johnpher/archive/2011/12/18/2570598.html


        

        

  • 相关阅读:
    SpringMVC 使用JSR-303进行校验 @Valid
    Hibernate Tools生成注释
    大型网站架构演变和知识体系(转载)
    eclipse从数据库逆向生成Hibernate实体类
    性能测试公众号,欢迎你的加入~
    mysql使用druid监控配置
    (转)面试为什么需要了解JVM
    (转)什么是缓存击穿?
    Mysql推荐使用规范(转)
    java应用监控工具
  • 原文地址:https://www.cnblogs.com/bkylee/p/4896246.html
Copyright © 2020-2023  润新知