码迷,mamicode.com
首页 > 编程语言 > 详细

白话C++系列(9)

时间:2016-04-23 14:47:01      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

精彩的类外定义

类内定义

问题:什么是类内定义?

将成员函数的函数体写在类的内部的方式称为类内定义。比如下面的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>

usingnamespacestd;

/*  ************************************************************************/

/*  定义一个Teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,具体要求如下:
/*   数据成员:
/*       名字
/*       年龄
/*       性别
/*   成员函数:
/*       数据成员的封装函数
/*       授课teach
/*  ************************************************************************/


classTeacher
{
public:
    voidsetName(string _name);
    stringgetName();
    voidsetGender(string _gender);
    stringgetGender();
    voidsetAge(int _age);
    intgetAge();
    void teach();

private:
    stringm_strName;    
    stringm_strGender;
    intm_iAge;
};


voidTeacher::setName(string_name)
{
    m_strName = _name;
}
stringTeacher::getName()
{
    returnm_strName;
}
voidTeacher::setGender(string_gender)
{
    m_strGender = _gender;
}
stringTeacher::getGender()
{
    returnm_strGender;
}

voidTeacher::setAge(int_age)
{
    m_iAge = _age;
}
intTeacher::getAge()
{
    returnm_iAge;
}
voidTeacher :: 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>
usingnamespacestd;
classTeacher
{
public:
    voidsetName(string _name);
    stringgetName();
    voidsetGender(string _gender);
    stringgetGender();
    voidsetAge(int _age);
    intgetAge();
    void teach();

private:
    stringm_strName;    
    stringm_strGender;
    intm_iAge;
};

源文件:

#include"Teacher.h"
#include<iostream>
#include<stdlib.h>

usingnamespacestd;

/*  ************************************************************************/

/*  定义一个Teacher类,要求分别采用同文件类外定义和分文件类外定义的方式完成,具体要求如下:
/*   数据成员:
/*       名字
/*       年龄
/*       性别
/*   成员函数:
/*       数据成员的封装函数
/*       授课teach
/*  ************************************************************************/

voidTeacher::setName(string_name)
{
    m_strName = _name;
}
stringTeacher::getName()
{
    returnm_strName;
}
voidTeacher::setGender(string_gender)
{
    m_strGender = _gender;
}
stringTeacher::getGender()
{
    returnm_strGender;
}

voidTeacher::setAge(int_age)
{
    m_iAge = _age;
}
intTeacher::getAge()
{
    returnm_iAge;
}
voidTeacher :: 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;
}

运行结果:

技术分享

白话C++系列(9)

标签:

原文地址:http://www.cnblogs.com/kkdd-2013/p/5424588.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!