1.声明和实现为什么要分开写
现在开始写项目了,你会发现我们一般都要写一个cpp,对应的还得有一个h文件,那么为什么在C++中我们要这么做?
.h就是声明,.cpp就是实现,而所谓分离式实现就是指“声明”和“定义”分别保存在不同的文件中,声明保存在.h文件、定义保存在.cpp文件中。
那么将声明和定义分离有什么意义吗?
首先从非分离式(声明的同时给出定义)看,其内容一般保存在.h文件中,以供多个源文件引用。
但是将定义放在头文件,那么当多个源文件使用#include命令包含此类的头文件便会在链接阶段出现“multiple definition”链接错误!
那么想让多个文件使用此头文件,又不引发链接的“multiple definition”错误该怎么办呢?
分离式的实现便可以解决这个问题。因为.h文件中只包含声明,即使被多个源文件引用也不会导致“multiple definition”链接错误。
所以分离式实现增强了命名空间的实用性。
2.案例:
首先我们要实现确定一个点是否在园内的功能
所以我们需要两个类一个Point类,一个Circle类
首先我们要先创建一个项目,名为Test2(这是我的项目名字)这里不做过多的解释,使用vs应该都会创建项目(我是创建的C++的项目,所以选择Win32控制台应用程序,创建的空项目)
然后右击项目名称—添加,点击创建类。
然后选择类,双击会出现下面的界面
键入Point会显示出一个.h文件,一个.cpp文件,点击完成,会出现一个源文件,一个头文件。文件名为Point
#pragma once
class Point
{
public:
int GetX();
int GetY();
Point(int x, int y);
Point();
private:
int x;
int y;
};
在Point.h文件中编入代码,是关于一些成员函数的声明#Pragma once 是表示只读一次
然后再Point.cpp文件中编入一下代码
#include "Point.h"
int Point::GetX() //要加上作用域 Point::
{
return x;
}
int Point::GetY()
{
return y;
}
Point::Point(int x1, int y1)
{
x = x1;
y = y1;
}
Point::Point()
{
}
主要是Point.h中的函数的实现,要引入Point.h头文件,所以要写入#include“Point.h”
然后再以同样的方法创建一个名为Circle的类
在Circle.h中编入以下代码
#pragma once
#include"Point.h"
class Circle
{
public:
double GetR(double r);
double GetS();
double GetC();
Point GetO();
bool IsInCircle(Point p);
Circle(Point o1, double r1);
Circle();
private:
double m_r;
double m_s;
double m_c;
Point o;
};
因为用到了Point 类,所以也要#include “Point.h”
在Circle.cpp中编入以下代码
#include "Circle.h"
#include"Point.h"
double Circle::GetR(double r) //要写出作用域Circle::
{
m_r = r;
return m_r;
}
double Circle::GetS()
{
m_s = 3.14*m_r*m_r;
return m_s;
}
double Circle::GetC()
{
m_c = 2 * 3.14*m_r;
return m_c;
}
Point Circle::GetO()
{
return o;
}
bool Circle::IsInCircle(Point p)
{
if (((p.GetX() - o.GetX())*(p.GetX() - o.GetX()) + (p.GetY() - o.GetY())*(p.GetY() - o.GetY())) <= m_r*m_r)
{
return true;
}
else
{
return false;
};
}
Circle::Circle(Point o1, double r1)
{
o = o1;
m_r = r1;
}
Circle::Circle()
{
}
也主要是Circle.h 中的函数实现,IsInCiicle是实现点是否在圆内的函数
然后右击源文件,添加,添加新项,创建一个.cpp文件,命名为main.cpp
此文件中有main方法,是程序的入口
在文件中编入以下代码
#include<iostream>
#include"Circle.h"
#include"Point.h"
using namespace std;
int main()
{
Point o = Point(0, 0);
Circle c1 = Circle(o, 5);
Point p1(3, 4);
bool b = c1.IsInCircle(p1);
cout << b << endl;
return 0;
}
确定好头文件,创建对象,调用方法