现在的位置: 首页 > 综合 > 正文

C++新特性(类)

2012年10月15日 ⁄ 综合 ⁄ 共 2824字 ⁄ 字号 评论关闭

类机制:

类是对某一类对象的抽象;对象是某一类的实例;

类是一种复杂的数据类型,将不同类型的数据和这些数据相关的操作封装在一起的集合体;

 

通过一道程序题来感受从结构到类的转变:

传统的面向过程程序设计中,程序的表示方法是:

程序=算法+数据结构

面向对象程序设计中,程序的表示方法是:

对象=算法+数据结构

程序=对象+对象+对象+。。。

 

一个操作银行账户的程序,用面向过程的方法来做,思路如下:

          先创建一个银行账户的结构,然后增加存钱,取钱,打印,初始化等相关的各种函数。

#include <iostream>

using namespace std;
struct savings{
    int accountId;
    float balance;
};
savings s;
void saving(float money);
void assume(float money);
void init();
void disp();
int main()
{
    float money=0;
    init();
    cout<<"请输入存款金额:"<<endl;
    cin>>money;
    saving(money);
    cout<<"请输入取款金额:"<<endl;
    cin>>money;
    assume(money);
    disp();
    return 0;
}
void init(){
    s.accountId=10000;
    s.balance=0;
}
void saving(float money){
    s.balance+=money;
}
void assume(float money){
    s.balance-=money;
}
void disp(){
    cout<<"账号:"<<s.accountId<<endl;
    cout<<"余额:"<<s.balance<<endl;
}

问题:如果这个时候,银行要求实现更多的功能,如外汇存款交易,外汇取款交易,自动利息计算等,则必须扩充原来数据结构,数据结构一旦改变,依赖它的函数也必须跟着改变,这样就需要不断地维护以前的函数,同时扩充新的函数

解决方法:用面向对象的方法来进行编程,先定义好一个银行账户类,然后不断地对这个类进行扩充和叠加就可以实现新功能,而不用维护原来的代码。类的定义格式一般分为声明和实现两部分,其中声明部分用来说明类中的成员(告诉使用者“干什么”),包含数据成员的声明和成员函数的声明。实现部分用来对成员函数的实现(告诉使用者“怎么干”)。

下面程序为用对象来实现银行账户的操作

在头文件saving.h中:

#ifndef SAVING_H_INCLUDED
#define SAVING_H_INCLUDED
#include<iostream>
class CSaving
{
    int accoutId;
    float balance;
public:
    void init(){
        accoutId=10000;
        balance=0;
    }
    void saving(float money)
    {
        balance+=money;
    }
    void assume(float money)
    {
        balance-=money;
    }
    void disp(){
        cout<<"账号为:"<<accoutId<<endl;
        cout<<"余额为:"<<balance<<endl;
    }
}


#endif // SAVING_H_INCLUDED

在源文件main.cpp中

#include <iostream>
#include "Saving.h"


int main()
{
    CSaving s;            //定义CSaving对象s
    float money=0;
    s.init();                 //初始化对象s,用对象来给其成员进行赋值和操作
    cout<<"请输入存款金额:";
    cin>>money;
    s.saving(money);
    cout<<"请输入取款金额:";
    cin>>money;
    s.assume(money);
    s.disp();
    return 0;
}


程序中 public关键字,使用来把类体中的成员函数的访问权限设定为公共访问权限,即定义为类对外的接口。具有公共访问权限的成员可以在程序中被对象访问和调用。

从代码中可以看出,所有的方法都是通过对象s调用的,相当于对象本身就具有存钱,取钱,打印和初始化等方法了。

通过这段代码和面向过程相比较,可以很清楚的感受到面向对象的优越性。如果是面向对象的程序设计方法,只需要把类设计好,然后用其定义对象,在程序中,就只是对象的叠加而已。

 

指向对象的指针:

对象指针名->数据成员名       //访问类的数据成员

对象指针名->成员函数名(参数表)     //访问类的成员函数

要访问CSaving类的对象指针pSaving所指向的对象中的成员,方法为:

pSaving = &CSaving

pSaving->accountId;

pSaving->saving(1.5);

 

内联函数:把函数实现放在类体中的成员函数,编译时被当做内联函数;调用时,是把调用函数处的语句,用内联函数体的代码来替换,节省了调用的开销,提高了运行的速度。

外联函数:函数声明放在类体内,实现放在类体外的成员函数,被称为外联函数。

成员函数如果在类体内,不用加作用域运算符“::”但如果在类体外,则要在函数名的前面加上该函数所属类的标识,并用作用域运算符“::”进行连接。

“::”主要用于说明成员函数是属于哪个类的,即成员函数的声明在哪个类中,该运算符的使用格式如下
类名::函数名(参数表)

如:void CSaving::assume(float money){

               ....

}

 

成员函数可以实现重载,如参数个数不同的重载

 

可以给成员函数的参数设置默认值:

如在CTest类中声明:void init(int n=10);

在存放函数定义的源文件:void CTest::init(int n){

                                                              sum=n;

                                                         }

在main.cpp中,CTest t1,t2;

                 t1.init();这个时候就是用默认值,

                  t2.init(5);这个时候是用的是传的参数5,不是用默认值。

 

类对成员访问控制

优点:1、如同电视机,内核被保护,按钮被人人使用;2、使类对其本身内部函数实现的负责;3、限制类与外部世界的接口;4、减少类与其他代码的关联程度。

各种控制关键字:

public公共访问:public定义的成员,就是类对外的接口,外部只能通过这个接口,才能访问类的成员。其一般是成员函数,以方便用户调用

protected和private定义的成员,一般是类的数据成员,主要用来描述类的对象的属性,用户无法直接访问和使用,只有类中成员函数才能对其进行访问和使用。

 

抱歉!评论已关闭.