白话C++系列(9)-- 类内定义与类外定义
2016-04-23 14:29 Keiven_LY 阅读(9365) 评论(1) 编辑 收藏 举报精彩的类外定义
类内定义
问题:什么是类内定义?
将成员函数的函数体写在类的内部的方式称为类内定义。比如下面的Student的类,我们可以看到,在定义成员函数的时候,包括每个成员函数用于实现的函数体,都在类的内部。
类内定义与内联函数的关系
类内定义的成员函数,编译器会将其优先编译为内联函数,但是对于复杂的成员函数无法编译成内联函数的,就编译成普通的函数。
类外定义
所谓类外定义是指成员函数的函数体写在类的外面。具体来讲,类外定义又分为以下两种形式:
所谓同文件类外定义,是指成员函数虽然定义在类的外面,但是其定义与类的定义在同一个文件当中。如下面的例子:
我们新建一个文件,文件名为Car.cpp,然后在这个文件中定义一个Car的类,定义的时候先写上汽车这个类的定义(class Car),并申明相应的成员函数,但是成员函数的实现或者说成员函数体的定义也写在这个文件中。那么成员函数既然写在了类的外面,我们就要标示出这个成员函数不是普通的函数,而是属于Car这个汽车的函数,我们就需要在这个函数的前面用这个类名再加上::标记出这个函数是属于这个类的。
下面介绍分文件类外定义,如果说同文件类外定义算是游击队的话,那分文件类外定义可以算是正规军了。几乎所有的c++项目,但凡是专业一点的c++程序员都会将类的定义分文件来完成,这样做有诸多好处,我们会在后续的课程中来给大家逐步讲解。下面来看一个例子来给大家说明分文件类外定义的写法。
分文件定义的时候,我们需要定义一个.h文件(头文件),类名建议与文件名写成一致。如下是一个Car.h头文件,在头文件中我们申明了类中的所有的数据成员和成员函数,在另外一个文件(Car.cpp)中,我们把所有的成员函数进行定义,定义的方式跟以前一样,最为关键的一点是需要将其头文件(Car.h)包含到Car.cpp中,如果没有这样的包含,Car.cpp将无法找到其相应的申明。
代码实践
题目描述:
/* ************************************************************************/ /* 定义一个Teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,具体要求如下: /* 数据成员: /* 名字 /* 年龄 /* 性别 /* 成员函数: /* 数据成员的封装函数 /* 授课teach /* ************************************************************************/
类内定义方式:
#include<iostream> #include<stdlib.h> #include<string> using namespace std; class Teacher { public: void setName(string _name); string getName(); void setGender(string _gender); string getGender(); void setAge(int _age); int getAge(); void teach(); private: string m_strName; string m_strGender; int m_iAge; }; void Teacher::setName(string _name) { m_strName = _name; } string Teacher::getName() { returnm_strName; } void Teacher::setGender(string _gender) { m_strGender = _gender; } string Teacher::getGender() { returnm_strGender; } void Teacher::setAge(int _age) { m_iAge = _age; } int Teacher::getAge() { returnm_iAge; } void Teacher :: teach() { cout<<"现在开始上课....."<<endl; } int main() { Teacher t; t.setName("孔子"); t.setGender ("男"); t.setAge(30); cout<<t.getName() <<" "<<t.getGender() <<" "<<t.getAge() <<" "<<endl; t.teach(); system("pause"); return 0; }
运行结果:
类外定义方式:
程序框架如下
头文件(Teacher.h)
#include<string> using namespacestd; class Teacher { public: void setName(string _name); string getName(); void setGender(string _gender); string getGender(); void setAge(int _age); int getAge(); void teach(); private: string m_strName; string m_strGender; int m_iAge; };
源文件:
#include"Teacher.h" #include<iostream> #include<stdlib.h> usingnamespacestd; /* ************************************************************************/ /* 定义一个Teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,具体要求如下: /* 数据成员: /* 名字 /* 年龄 /* 性别 /* 成员函数: /* 数据成员的封装函数 /* 授课teach /* ************************************************************************/ void Teacher::setName(string _name) { m_strName = _name; } string Teacher::getName() { returnm_strName; } void Teacher::setGender(string _gender) { m_strGender = _gender; } string Teacher::getGender() { returnm_strGender; } void Teacher::setAge(int _age) { m_iAge = _age; } int Teacher::getAge() { returnm_iAge; } void Teacher :: teach() { cout<<"现在开始上课....."<<endl; } int main() { Teacher t; t.setName("孔子"); t.setGender ("男"); t.setAge(30); cout<<t.getName() <<" "<<t.getGender() <<" "<<t.getAge() <<" "<<endl; t.teach(); system("pause"); return 0; }
运行结果: