• c++类定义和类实现


    预备知识:

    c++中我们cpp文件和.h文件的区别是,cpp文件是需要编译的文件,成为一个独立的编译单元,而h文件从来是不需要编译,只是用于预处理。

    通常我们在cpp文件中,完成函数的实现,然后在h中则是对于函数的声明,由于默认情况下,全局变量和全局函数存储类型都是extern类型的,所以我们不需要显示的使用extern

    这样,我们其他的cpp文件,只要#include .h文件,则在cpp中实现的函数,就能在其他cpp中使用,因为我们已经用.h文件,完成了extern函数声明的操作。

    c++类的定义,其实就是定义一个类型。

    class A{

    public:

      void  fun(int n);

      int   fun1(void);

    public:

      int  num;

    };

    其实就是定义了一种类型。和我们通常所说的定义不一样。

    类的定义,是不能重复定义的,在同一个编译单元中,只能定义类一次。如果重复定义,会出错。同时类声明和类定义都是内部链接。只是为当前编译单元所用。

    因此,把类的定义,放在.h文件中,类的实现放在专门的cpp中。这样包含.h的其他cpp,就可以使用cpp中实现的函数。。

    同时注意:类的实现cpp文件的编译,必须依赖于类的定义文件.h,所以我们在类实现文件cpp中必须#include< ........h>,用于编译,否则会出错。这是不同于普通的函数。

    //student.h                 (这是头文件,在此文件中进行类的声明)
    class Student                            //类声明        
    { public:
    void display( );                  
    private:
    int num; 
    char name[20];     
    char sex;                            
    };
    //student.cpp                            //在此文件中进行函数的定义
    #include <iostream>
    #include ″student.h″                     
    void Student∷display( )                 
    {cout<<″num:″<<num<<endl;          
    cout<<″name:″<<name<<endl; 
    cout<<″sex:″<<sex<<endl;   
    }
    //main.cpp                            主函数模块
    #include <iostream>
    #include ″student.h″                 
    int main( )
    {Student stud;                       
    stud.display( );                     
    return 0;
    }

    类中只有static成员变量。具有外部链接特性。所以这要求,static成员变量的初始化一定要在.Cpp文件中。如果在h文件中。那么多个cpp文件#include,则发生多次重复定义的错误。

    类定义和类实现分离的好处

    1/快编译速度

    当然可以啊。相反,如果你把类的所有代码都内联定义到头文件中,那么所有需要用到这个类的CPP文件实际上都包含了更多的代码,编译器编译每个这样的CPP文件时都编译了这些代码。而分开定义,这些代码就只被编译了一遍,也就是在编译实现那个类的CPP文件时。

    在特殊情况下确实可以的
    假如我有一个类a被几百个cpp同时包含,如果定义和声明放在一起,只要我对a进行任何修改,那几百个文件都必须被重新编译。而如果头文件只包含声明,修改a的实现不会导致那些文件被重新编译,有时可以极大的提高速度

  • 相关阅读:
    flume1.7.0的安装与使用
    获取top10
    editplus格式化xml文档
    LOG4J.PROPERTIES配置详解
    Oracle自增列
    javascript 传递引用类型参数
    {JavaScript}栈和堆内存,作用域
    JAVA中String与StringBuffer的区别
    Java中堆和栈的区别(转)
    JAVA错误:org.apache.jasper.JasperException: java.lang.ClassCastException:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apach
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4660073.html
Copyright © 2020-2023  润新知