第二个问题:你问的是普通编译器的工作原理,还是解释执行编译器的工作原理。他们是不太一样的,分别给你介绍一下:
1.编译器的原理市面上书此顷籍大多一样,看清华的《编译原理》即可,作为了解。编译原理的核心是一种文法的理解,编译器最早是从图灵机开始的,有限/无限自动机原知禅理(这个就比较老了,而且理论性较强,我有一本外文自动机原理的电子版,如有需要留邮箱)。首先编译器要具有一种文法识别功能,把表达式的各标志、变量、运算符等等储存起来,然后link变成可执行文件(中间穿插语法分析等)。
2.解释性编译器执行效率低,它的前半部分和普通编译器一样,同样有词法分析、语法分析,但是它没有link连接,而森猛陆是解释一遍就执行一遍,效率低,小程序可以。
“编译原理”是一门学科,不可能我三言两语就讲清楚,建议你多学多看多留心,自己悟出其中的奥妙。
后来你说的这个,具体我也不太清楚,我认为的是这样的:C++的处理机制是分模块的,用户自己创建的话,它有一个模块处理,只预编译头文件的话,可以提高编译速度,尤其对于大程序。而设计模板的时候,C++就会调用模板处理模块,那个模块可能就是默认.h和.cpp在一起的,而且你可以想象一下,如果只编译.h的话,如果你的程序中使用了模板的某个具体部分,C++还是需要处理模板中.cpp的部分,而这部分没有被编译,会出问题的。也就是说,你编了一个具有公共使用功能的模板,这个模板的每个部分对于C++来说,都是很必要的。
#include <cstdio>#include <string>
#include <iostream>
using namespace std
template <class T>
class Student
{//Student 模板类
private:
string Name
int Sno
T Score[3]//镇郑成绩 数学 英语 计算机
T sum//总分
T avg//平均分
public:
Student(string name,int sno,T* p)//构造函数链哗
{
Name = name
Sno = sno
for (int i = 0i <3i++)
Score[i] = p[i]
sum = 0
avg = 0
}
void score_cal()//计算平均分和总分
{
for (int i = 0i <3i++)
{
sum += Score[i]
}
avg = sum / 3
}
T get_sum() {return sum}
T get_avg() {return avg}
void display()//学生信息展示
{
cout <<Sno <<"御唤颂 " <<Name <<" " <<Score[0]
<<" " <<Score[1] <<" " <<Score[2]
<<" " <<sum <<" " <<avg <<endl
}
}
int main()
{//主函数
int score[] = {87,78,84}
Student <int>stu("小红",1,score)//实例化对象
stu.score_cal()//调用计算成绩方法
cout <<"学号" <<" " <<"姓名" <<" " <<"数学" <<" " <<"英语"
<<" " <<"计算机" <<" " <<"总分" <<" " <<"平均分 " <<endl
stu.display()//展示学生信息
return 0
}
我发个简单的类模板程序(求两个任意类型数的和)。template<class T>
class A
{
public:
A()
A(T _a,T _b)
T sum()
private:
T a
T b
}
template <class T>
A<T>::A()
{
a=0b=0
}
template<class T>
A<T>::A(T _a,T _b)
{
a=_ab=_b
}
template<class T>
T A<T>::sum()
{
return (a+b)
}
void main()
{
A<int>ai(3,4)
A<double>ad(3.1,4.0)
cout<<ai.sum()<<" "<<ad.sum()<<endl
}
程序已经在vc6.0下调试通过,你自裤尺己看看吧。
以上代码在一个戚纯卜文件中,别把类高穗的声明放在一个.h中把实现放在.cpp中,类模板不支持分离只能是类的声明和定义放在同一个文件中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)