声明(declare)做的事情是,告诉编译器有这么个 符号(函数/变量) 存在,让编译器允许后面的代码使用这个符号。
定义(define) 做的事情是,为这个 符号(函数/变量) 分配内存空间/获取其地址,让编译器知道去哪里找这个符号。
2. 为什么要把声明写在头文件中?
为了方便。
这个问题比较好理解。符号的声明并不是必须写在头文件中,写在源文件中也没问题,只要写在使用这个符号之前就行。
为什么把定义写在源文件中?
定义 不能写在头文件中,写在头文件中会出问题(static定义 除外)
如果头文件中有符号(函数/变量)的定义,当这个头文件被多个源文件include时,相当于每个源文件中都定义了同一个符号(函数/变量),这样是不合法的,编译器会报错 duplicate symbol. 符号(函数/变量)可以被多次声明,但不能被多次定义,因为定义会分配内存空间 &&确定符号的地址。
需要特殊说明的是,static类型的符号(函数/变量)定义在源文件中编译器不会报错,因为static意味着符号只会在单个编译单元中可见,因此多个源文件之间不会出现 duplicate symbol 的问题。
综上,最佳实践是:将声明写在头文件中,将定义写在源文件中。
一般为了安全性,只在头文件中进行声明,而不定义,在其它文件中进行定义。给你个例子。因为我学了才一年,所以没法给你说过多的理论,给你两个例子你好好体会把。简单例子实现输出两个数据。
/*在text。h头文件中进行声明*/
#include<iostream>
using namespace std
void display(int,int)/*使用该函数来实现输出*/
/*在texxt。cpp中进行定义,注意第一行,很重要因为不是c++标准库中的头文件,所以不能用<>,而要用""括起头文件*/
#include "text.h"
void display(int x,int y)
{
cout<<"A="<<x<<"B="<<y<<endl
}
/*在主函数中进行调用函数*/
#include "text.h"
int main()
{
int a,int b
cout<<"please input a &b"<<endl
cin>>a>>b
display(a,b)
return 0
}
下面这个例子实现类的头文件中声明,实现2*3矩阵的加法运算,并进行重载输入输出流。
在/*matrix。h中声明*/
#include <iostream.h>
class Matrix
{
private:
int a[2][3]
public:
Matrix operator + (Matrix&)/*重载加法运算符*/
friend istream&operator>>(istream&,Matrix&)/*重载输入流*/
friend ostream&operator<<(ostream&,Matrix&)/*重载输出流*/
}
/*在matrix。cpp中进行定义*/
#include "matrix.h"
Matrix Matrix::operator +(Matrix&w)
{
Matrix x
for(int i=0i<2i++)
{for(int j=0j<3j++)
x.a[i][j]=this->a[i][j]+w.a[i][j]
}
return x
}
istream&operator>>(istream&w,Matrix&y)
{
for(int i=0i<2i++)
{for(int j=0j<3j++)
cin>>y.a[i][j]
}
return w
}
ostream&operator <<(ostream &x,Matrix&z)
{
for(int i=0i<2i++)
{
for(int j=0j<3j++)
cout<<z.a[i][j]<<" "
cout<<endl
}
return x
}
/*主函数中调用*/
#include "matrix.h"
int main()
{
Matrix c,d,e
cout<<"Please input the first matrix column!"<<endl
cin>>d
cout<<"Please input the second matrix column!"<<endl
cin>>e
cout<<"Here is the plus result of the two matrix columns!"<<endl
c=d+e
cout<<c
return 0
}
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型,函数原型描述了函数的接口。定义函数的程序员提供函数原型,使用函数的程序员就只需要对函数原型编辑即可。比如:【返回类型】函数名(参数1类型参数1,参数2类型参数2,……);实例:boolswap(inta,intb)例子中函数的返回类型为bool型,两个参数都是int型,一个名称为a,一个名称为b函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!如果是自己写的函数,在声明函数的同时要对函数进行定义。假设头文件名为head.h,源文件名为main.cpp,两个文件在同一个目录下在头文件中直接加上intswap(inta,intb)这一句就可以了在源文件中还要加上include"head.h"并且加上函数的定义:boolswap(inta,intb){//swap函数用于两个数据交换intcc=aa=bb=c}注意在头文件中声明后记得在源文件中包含这个头文件,要不然是找不到函数的定义的。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)