精华内容
下载资源
问答
  • C++将类写在头文件

    千次阅读 2019-08-26 16:03:55
    比如有个ABC要在main.cpp内使用,创建两个文件 ABC.h,ABC.cpp。...头文件只是提供声明,#include了头文件是保证main.cpp知道了接口。而链接才是把ABC的代码加入到生成的可执行文件中。既要...

    比如有个类ABC要在main.cpp内使用,创建两个文件 ABC.h,ABC.cpp。
    把类的声明都写在h里面,方法的实现写在cpp里面,然后在main.cpp内#include “ABC.h”,然后编译,如果是工程就把ABC都加到工程里,如果不是就要手动链接了。
    头文件只是提供声明,#include了头文件是保证main.cpp知道了接口。而链接才是把类ABC的代码加入到生成的可执行文件中。既要知道接口有要代码实现,才能使用ABC。
    最好将类的声明放在.h文件,类的定义放在.cpp文件,如若将类的声明和定义都放在.h文件,当多个文件同时包含这个.h文件会出现建置错误,因为你重复定义了。正确格式如下:

    test01.h
    class A
    {
    private:
    int a;
    public:
    A(int n):a(n){}
    int GetA() const;
    };
    
    test01.cpp
    #include "test01.h"
    int A::GetA() const
    {
    return a;
    }
    
    展开全文
  • 将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中 写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由Point派生出Circle...

    将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

    写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~

    题目:定义Point类,由Point派生出Circle类,再由Circle派生出Cylinder类。将类的定义部分分别作为3个头文件,对他们的成员函数的定义分别作为3个源文件

    1、Point.h文件

    复制代码

     1 #ifndef POINT_H
     2 #define POINT_H
     3 #include<iostream>    //头文件也需要包含这个
     4 using namespace std;
     5 
     6 class Point
     7 {
     8 protected:
     9     float x, y;
    10 public:
    11     Point(float a = 0, float b = 0);     //带默认参数的构造函数的声明
    12     float getX();
    13     float getY();
    14     void setPoint(float, float);
    15     friend ostream& operator<<(ostream &output, const Point &p);    //运算符重载
    16     
    17 };
    18 
    19 #endif

    复制代码

    2、Circle.h文件

    复制代码

     1 #ifndef CIRCLE_H
     2 #define CIRCLE_H
     3 
     4 #include "Point.h"
     5 
     6 class Circle:public Point
     7 {
     8 public:
     9     Circle(float a = 0, float b = 0, float r = 0);
    10     float getR();
    11     void setR(float r);
    12     float area();
    13     friend ostream& operator<<(ostream &output, Circle &c);    //运算符重载
    14 protected:
    15     float radius;
    16 };
    17 
    18 #endif

    复制代码

    3、Cylinder.h文件

    复制代码

     1 #ifndef CYLINDER_H
     2 #define CYLINDER_H
     3 
     4 #include "Circle.h"
     5 
     6 class Cylinder :public Circle
     7 {
     8 public:
     9     Cylinder(float a = 0, float b = 0, float r = 0, float h = 0);
    10     void setH(float h);
    11     float getH();
    12     float area();
    13     float volume();
    14     friend ostream& operator<<(ostream &, Cylinder &);
    15 private:
    16     float height;
    17 };
    18 
    19 #endif

    复制代码

    4、Point.cpp文件

    复制代码

     1 #include<iostream>
     2 #include"Point.h"
     3 using namespace std;
     4 
     5 Point::Point(float a, float b)
     6 {
     7     x = a;
     8     y = b;
     9 }
    10 
    11 float Point::getX()
    12 {
    13     return x;
    14 }
    15 float Point::getY()
    16 {
    17     return y;
    18 }
    19 void Point::setPoint(float a, float b)
    20 {
    21     x = a;
    22     y = b;
    23 }
    24 
    25 ostream& operator<<(ostream &output, const Point &p)    //重载运算符“<<”
    26 {
    27     output << "(" << p.x << "," << p.y << ")" << endl;
    28     return output;
    29 }

    复制代码

    5、Circle.cpp文件

    复制代码

     1 #include<iostream>
     2 #include"Circle.h"
     3 using namespace std;
     4 
     5 Circle::Circle(float a, float b, float r) :Point(a, b), radius(r) { }
     6 
     7 float Circle::getR()
     8 {
     9     return radius;
    10 }
    11 
    12 void Circle::setR(float r)
    13 {
    14     radius = r;
    15 }
    16 
    17 float Circle::area()
    18 {
    19     return 3.14*radius*radius;
    20 }
    21 
    22 ostream& operator<<(ostream &output, Circle &c)    //运算符重载
    23 {
    24     output << "圆心:(" << c.x << "," << c.y << ")   半径:" << c.radius << "     面积:" << c.area() << endl;
    25     return output;
    26 }

    复制代码

     

      6、Cylinder.cpp文件

    复制代码

     1 #include<iostream>
     2 #include"Cylinder.h"
     3 using namespace std;
     4 
     5 Cylinder::Cylinder(float a, float b, float r, float h) :Circle(a, b, r), height(h) { }
     6 
     7 void Cylinder::setH(float h)
     8 {
     9     height = h;
    10 }
    11 
    12 float Cylinder::getH()
    13 {
    14     return height;
    15 }
    16 
    17 float Cylinder::area()
    18 {
    19     return 2 * Circle::area() + 2 * 3.14*radius*height;
    20 }
    21 
    22 float Cylinder::volume()
    23 {
    24     return Circle::area()*height;
    25 }
    26 
    27 ostream& operator<<(ostream &output, Cylinder &cy)    //cy.area() 属于同名覆盖
    28 {
    29     output << "圆心:(" << cy.x << "," << cy.y << ")   半径:" << cy.radius << "  高:" << cy.height << "\n                  面积: " << cy.area() << "   体积:" << cy.volume() << endl;
    30     return output;
    31 }

    复制代码

    7、main函数

    复制代码

     1 //习题6.1
     2 //#include<iostream>
     3 //#include"Point.h"
     4 //#include"Circle.h"
     5 #include"Cylinder.h"
     6 //using namespace std;
     7 
     8 int main()
     9 {
    10     Cylinder cy1(3, 3, 5, 6);
    11     cout << "original cylinder:" << cy1 << endl;
    12     cy1.setPoint(-2, -2);
    13     cy1.setR(8);
    14     cy1.setH(10);
    15     cout << "new cylinder: " << cy1 << endl;
    16     Point &p1 = cy1;
    17     cout << "as a point: " << p1 << endl;
    18     Circle &c1 = cy1;
    19     cout << "as a circle: " << c1 << endl;
    20     return 0;
    21 }

    复制代码

     

    运行结果:

    总结:

    1、在写头文件是要注意写

    #ifndef POINT_H
    #define POINT_H

    ……

    #endif

    可以避免多次包含同一头文件,防止重定义

    2、基本的头文件要写在.h文件中

    展开全文
  • 当第一次include这个头文件后,编译器就会进入头文件中,并且定义_COMPLEX_,这个就定义好了,在第二次include时,就不需要再进入头文件定义了,因为编译器已经有_COMPLEX_了,避免了重复的include含 的动作。...

    complex.h
    1、防卫式声明
    #ifndef COMPLEX//告诉编译器曾经没有
    #define COMPLEX
    。。。。
    #endif
    作用:发展一个复数,把它放在头文件中,因为很多程序要用到这个头文件,include"complex",当第一次include这个头文件后,编译器就会进入头文件中,并且定义_COMPLEX_,这个就定义好了,在第二次include时,就不需要再进入头文件定义了,因为编译器已经有_COMPLEX_了,避免了重复的include含入 的动作。
    Header(头文件)布局

    #ifnedf _COMPLEX_
    #define  _COMPLEX_
    //-----------------第一部分:前置声明-----------------
    #include<cmath>
    
    class ostream;
    class complex;
    
    complex& 
    	_doapl(complex* ths,const complex& r);
    //----------------第二部分:类声明----------------------
    class complex{
    ....
    };
    //----------------第三部分:类定义-----------------------
    complex::function....
    #endif
    

    2、inline函数
    在类内直接声明定义的函数不用加inline就是内联函数了,只是如果函数在类内只是声明,在外面定义,为了把他写成内联函数,需要加inline关键字。

    3、访问级别(access level)
    public、private、protected
    private:数据的部分,需要封装,把数据很好的包裹起来。默认
    public:大部分函数,需要被使用
    protected:

    4、构造函数(constructor)
    当你需要创建一个对象,有一个函数会自动被调用起来
    特点:
    (1)构造函数名称必须与类的名称一致
    (2)没有返回类型,因为构造函数就是为了创建对象,不能改变,所以不必谢,也就没有返回值。
    注意:complex (double r=0;double i = 0):re®,im(i)//这一行只有构造函数有,叫做初值列,初始列,把r设给re,i设给im,其实放到本体上也行,为什么呢?简单讲就是一个变量数值的设定两阶段,初始化和赋值,以上是初始化,这样做就是为了直接初始化,如果放在本体中,其实是有点初始化晚了。就是效率上会好一些。
    {…}
    (3)不可能在类中去调用构造函数。对应的也有一个析构函数,class有带指针的和不带指针的,不带指针的就不需要析构函数
    (4)构造函数可以有很多个overlording(重载),但是重载的函数不能在函数名后面加const,这样就冲突了,为什么能重载?在类中函数名重载,但是在编译器看来,经过编译之后的结果其实是不同的函数的。注意:在编写函数重载时,需要注意函数在调用的时候不能有冲突,使得编译器无法判断。
    (5)什么情况可以啊构造函数放在private区中?
    有一些设计模式可以放在里面,但目前为止不要放。
    5、const member function(常量成员函数)
    double real() const{};//const放在函数后面。
    A:有什么用呢?
    Q:当要打印一些东西的时候,里面的东西是不改变的,所以可以加const作为常量成员函数。
    6、参数传递:pass by value & pass by reference(to const)
    const reference(例如:const complex&):表示传入的引用是不能改的。参数传递尽量传引用,因为速度更快。
    7、friend(友元)
    在语言中:朋友可以来拿,指的是数据。
    例如:在private中的数据不能通过外部来取,
    friend complex& __doapl(complex*,const complex&);//声明
    //定义
    inline complex&
    __doapl(complex* ths,const complex& r){
    ths->re += r.re;
    ths->im += r.im;
    return *ths;
    }
    自由取得friend的private成员,这样就可以直接取得私有数据,而不用通过调用函数取得。但是friend也在一定程度上打破了C++的封装,所以可以进行选择,选用朋友这种方式或者通过调用函数。
    8、相同class 的各个object互为friend(友元)
    也就是例如一个student的类,其中的成员数据包括姓名,学号等。
    创建了三个对象,s1,s2,s3。s3中的成员函数可以直接调用s2中的私有的成员数据。为什么呢?
    答案也就是这一个小标题的说法。
    9、class body外的各种定义
    什么情况用pass by reference
    什么情况用return by reference
    注意:返回引用的时候,函数中的返回的引用在程序完成后仍然存在才行,不然得到的是坏东西。

    展开全文
  • c++模板/模板函数的声明与定义应该放在头文件里,不要分开来写中函数的声明与定义(比如在.H文件里声明某个...所应该模板/模板函数的定义与声明写在一个.h文件里。 比如 在头文件声明了一个函数 te...

    https://blog.csdn.net/zhengqijun_/article/details/81159433

     

    c++模板类/模板函数的声明与定义应该放在头文件里,不要分开来写类中函数的声明与定义(比如在.H文件里声明某个成员函数,在.CPP文件里定义该成员函数),这样会导致连接错误。所应该将模板类/模板函数的定义与声明写在一个.h文件里。

    比如

    在类的头文件声明了一个函数 template<typename T> void fun(T a);

    然后在另一个CPP 文件里 实现该函数

    template<typename T> void fun(T a)

    {

    /*函数实现*/

    }

     

    这样就会报错,

    解决的办法只能是在声明的时候直接实现函数,不要再把函数实现写在另一个CPP文件里,不过这样看起来结构很乱就是了。
    --------------------- 
     

    展开全文
  • 头文件

    2014-02-24 22:46:20
    而.h文件则被称作C++头文件,里面的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是...
  • 头文件一般什么

    2019-06-19 20:29:11
    一般的c和c++工程里面头文件应该那些内容: 1宏定义(#define) 2结构体、联合体和枚举类型的定义(这个地方对结构体有时候称为定义,有时候称为声明,个人认为定义更合适一点). 3声明的定义(不是的对象...
  • 声明头文件和实现文件中的区别

    千次阅读 2015-10-13 14:56:02
    objective-c中有分类和扩展的概念,而实现文件中的类声明实际上就是扩展 @interface部分为扩展(extension)。 其被设计出来就是为了解决两个问题的,其一,定义私有方法的地方,也就是下面说到的区别...
  • 在VS中新建TheC++StandardLibrary项目,在test测试tie的功能,测试函数声明在test.h文件,实现到test.cpp文件,编译时提示错误: fatal error LNK1120: 1 个无法解析的外部命令 百度时才注意到,这是一个模板...
  • 定义与声明头文件与extern总结

    千次阅读 2017-09-29 17:40:56
    用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字?  如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢?...
  • 如果在头文件中不需要这个的具体实现细节(不会用到它提供的方法等信息)则用前值声明就可以 前置声明就是@class A 他告诉编译器A是一个 但是编译器并不会知道这个的详细信息 减少头文件引入其他的...
  • 1、用Objective-C语言编写“”的标准方式:以类名做文件名,分别创建两个文件,头文件后缀用.h,实现文件后缀用.m。 2、用Objective-C语言编写任何几乎都需要引入Foundation.h。如果不在该本身引入这个文件...
  • C++ 模板头文件

    千次阅读 2019-08-04 20:12:03
    今天模板函数分成了声明和定义两个文件: 模板声明: #pragma once #ifndef FIND_ITEM #define FIND_TIEM template <typename elemType> const elemType* find_item(const elemType* first, ...
  • Objective-C声明头文件和实现文件中的区别 转自codecloud(有整理) 调试程序的时候,突然想到这个问题,百度一下发现有不少这方面的问答,粗略总结一下: 属性写在.h文件中和在.m文件中有什么区别? Objective-C...
  • 头文件的建立

    千次阅读 2019-05-24 20:49:47
    比如搞一个LCD_1602显示红外接收的信号,主要是LCD_1602的函数模块放入头文件中 接下来总结步骤: 1:建立一个新文件,放入代码所在目录下,命名后缀.h如创立一个LCD_1602操作的头文件lcd.h 加入必要的宏定义和...
  • C++头文件

    2011-10-21 14:53:43
    1.一般的定义都会放入头文件 public class MyClass{ ...code... }; 2.头文件用于声明而不用于定义 extern int val; //right extern int ival = 10 // error double jval; //error 3.一些const对象定义在...
  • 与C、C++一样,Objective-C也使用“头文件”和“实现文件”来区隔代码。用Objective-C语言编写的标准方式:以类名做文件名,分别创建2个文件,头文件后缀.h,实现文件.m ...使用向前声明延后引入头文件时机 比如存...
  • C语言头文件

    千次阅读 2018-01-22 09:47:56
    3.函数和结构的声明 Question1:#include<a.h>和#include“a.h”有什么区别? #include<a.h>引用的是标准库的头文件,也就是说编译器是从标准库进行开始搜索,而#include”a.h”则是属于非标准库的...
  • C++的头文件、Extern、声明&定义-解析

    千次阅读 2019-10-11 08:47:46
    一、头文件 首先说下头文件,其实... 我做过一个实验,将头文件的后缀改成xxx.txt,然后在引用该头文件的地方用  #include"xxx.txt" 编译,链接都很顺利的过去了,由此可知,头文件仅仅为阅读代码作用,没其...
  • 1、用Objective-C语言编写“”的标准方式:以类名做文件名,分别创建两个文件,头文件后缀用.h,实现文件后缀用.m。 2、用Objective-C语言编写任何几乎都需要引入Foundation.h。如果不在该本身引入这个文件...
  • 头文件中应该些什么

    千次阅读 2013-07-02 14:51:16
    头文件中应该些什么 1.宏定义(预处理 #define) 2.结构,联合和枚举声明 3.typedef声明 4.外部函数声明 5.全局变量声明 注: 0.一个好习惯, 除了static,inline,extern函数,正常的函数不要在.h里实现...
  • 头文件中应该放些什么2作者:佚名 来源:不详 录入:Admin 更新时间:2008-8-17 19:38:48 点击数:... 作为一般规则, 应该把这些东西放入头(.h)文件中: 宏定义(预处理#defines)结构、联合和枚举声明typedef声明外部函...
  • 转自:https://www.cnblogs.com/tshua/p/5741009.html用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include&lt;xxx...
  •  在平常的 C/C++ 开发中,几乎所有的人都已经习惯了把和函数分离放置,一个 .h 的头文件放声明,对应的 .c 或者 .cpp 中实现。从开始接触,到熟练使用,几乎已经形成了下意识的流程。尽管这样的做法无可厚非...
  • 函数实现放在头文件

    千次阅读 2020-02-20 17:19:57
    研究一个开源算法库,采用C++模板编程,所有函数实现都放在了头文件中,现在把模板去掉,链接时发生冲突,具体原因如下:  因为多个源文件包含了含有函数定义的头文件,在编译的时候,每个源文件都会包含一份函数...
  • 自己动手写头文件

    2020-06-16 17:10:00
    全局变量的定义和结构体的定义,这些必须得写的,但是全堆在一起就会显得很冗杂不美观,我们也可以把这些放入头文件里面。 一些自创的常用的函数也可放入头文件,构建函数库,类似于stdio.h等头文件 … 话不瞎扯...
  • c++ 头文件

    多人点赞 2015-03-21 16:12:24
    而.h文件则被称作C++头文件,里面的也是C++的源代码。 C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,643
精华内容 14,257
关键字:

如何将类的声明放入头文件