C++ 头文件与cpp文件

有头文件stack.h和cpp文件stack.cpp
stack.h的内容是:

#ifndef Stack_h
#define Stack_h
class Stack
{
private:
int *data;//存放栈数据
int count;//存放栈顶指针
int size;//栈的容量
public:
Stack(int stacksize=10);//构造函数建立具有10元素的默认栈
~Stack();
void Push(int x);//元素入栈
int Pop();//元素出栈
int howMany();//判定栈中有多个元素
};
#endif

stack.cpp的内容:
#include "stack.h"
#include <iostream>
using namespace std;
Stack::Stack(int stacksize)
{
if(stacksize>0)
{
size=stacksize;
data=new int[stacksize];
for(int i=0;i<size;i++)
data[i]=0;
}
else
{
data=0;
size=0;
}
count=0;
}
Stack::~Stack()
{
delete []data;
}
void Stack::Push(int x)
{
if(count<size)
{
data[count]=x;
count++;
}
else
{
cout<<"堆栈已满,不能再压入数据: "<<x<<endl;
}
}
int Stack::Pop()
{
if(count<=0)
{
cout<<"堆栈已空!"<<endl;
exit(1);//堆栈操作失败,退出程序!
}
count--;
return data[count];
}
int Stack::howMany()
{
return count;
}
为什么头文件写出函数却不在头文件里定义而在一个cpp文件里定义,这两个文件是怎么联系起来的?

第1个回答  2012-12-20
首先,我想说也可以在头文件中把代码写全,但是这样做的话,就会造成代码不易阅读的问题,如果只把类的声明写在头文件中,类的实现写在.cpp文件中,就会解决代码不易阅读的问题。
其次,还有个问题就是函数的重复定义的问题,如果你把声明和实现都写在头文件的话,这个头文件如果被其他的文件多次include的时候,就会报有关“重复定义”的错误(当然,如果你在头文件中写类似的宏#ifndef **.h ...也可以解决这个问题)。
还有就是:在编译的时候,.h 文件不会直接参与编译,.cpp文件是要直接编译的,而通过
include "*.h"文件,使得头文件中的代码得到编译。本回答被网友采纳
第2个回答  2012-12-20
cpp文件里有个#include 包含了你写的头文件 可以这样理解编译的时候编译器把头文件的内容放到cpp文件里了追问

cpp里面的data=new int[stacksize];这函数是什么意思??那data是什么来的!?

追答

data 在.h文件里有定义 是指针 这句的意思是申请一段常为stacksize的int型数组

追问

其实还有一个函数stackmain.cpp,但怎么跟stack.cpp有联系呢??

#include "stack.h"
#include
using namespace std;
void main()
{
Stack s1;
s1.Push(1);
s1.Push(12);
s1.Push(32);
int x1=s1.Pop();
int x2=s1.Pop();
int x3=s1.Pop();
cout<<x1<<"\t"<<x2<<"\t"<<x3<<endl;
}
就是都是cpp文件,先编译器先编译了stackmain。cpp那不是有问题吗?

本回答被提问者采纳
第3个回答  2012-12-20
头文件声明函数是规范,当然也可以定义函数,不规范罢了,cpp中#include "头文件"就相当于是把头文件的内容放到cpp的开头
第4个回答  2012-12-20
头文件一般只声明,然后在CPP里#include“XXXX.h”就可以了
客户一般就只能看到头文件,也就是说知道我们用了哪些函数,但是看不到我们代码的实现(在CPP里)追问

那可以在头文件定义函数么??

追答

可以,你写一些简单的函数试试就知道了

相似回答
大家正在搜