C++中的类与对象

C++中的类与对象

标签(空格分隔): c++
作者:陈小默


开发环境:Visual Studio 2010

定义类

通常,C++程序将接口(类定义)放在头文件中,并将实现(类方法的代码放在源代码文件中),本文章以一个学生的例子来完成代码。

学生定义:记录三门课程(语文,英语,数学)的成绩,能够查看学生的平均成绩

创建头文件

现在创建名为student.h的头文件

//student.h -- Student class interface
//version 00
#ifndef STUDENT_H_
#define STUDENT_H_

#include <string>

class Student{ //class declaration
private:
    std::string name;
    int ch;
    int en;
    int math;
    float average;
    void count(){
        average = (ch + en + math+0.0F)/3;
    }
public:
    Student();//构造函数
    ~Student();//析构函数
    void setName(std::string name);
    void setChScore(int score);
    void setEnScore(int score);
    void setMathScore(int score);
    void show();
};

#endif

注意:类定义和结构体定义一样,要在最后加上(分号)

类和结构体

关键字class指明这些代码定义了一个类设计,在这里classtypename不是同义词,不能使用typename代替class

类描述看上去很像是包含成员函数以及public和private可见性标签的结构声明。实际上,C++对结构进行了扩展,使之具有相同的特性。它们之间唯一的区别就是,结构体的默认访问类型是public,而类为private。C++程序猿通常使用类来实现类的描述,而把结构体作为纯粹的数据对象表示。

访问控制

在C++程序中通常使用访问控制关键字来保证自身属性的可见性。常见的三个关键字为privatepublicprotected

关键字含义
privateC++中的默认访问权限,也就是说上述student.h文件中的private关键字可以省略。其含义表示为只有该对象自身可以访问这些属性或者方法,被private修饰的属性和方法对于外部来说不可见
public公有权限,表示被public修饰的属性和方法可以被外部程序直接调用
protected受保护的权限,表示这些属性和方法仅仅能被该类和派生类的内部访问,也就是说,对于外部世界来说,保护成员的行为与private相同,对于派生类来说,保护成员的行为和public相同

作用域解析运算符

在具体实现一个类之前,我们需要先了解一个运算符:作用域解析运算符(::)。该符号的作用是用来标识一个函数所属的类,例如当我们输入Student::average()时。表示我们访问的average()方法属于Student类而不是其他的类。
但是在一个Student类的内部我们并不需要使用使用作用域解析运算符就能访问average()方法,这是因为在类的内部自身所定义的所有方法对自身来说都是可见的。
对于一个方法名称来说,Student::average()是方法的函数限定名(全称),而average()方法属于非限定名(简称),当程序对于一个函数来源无异议时(没有重名方法),可以使用简称。

实现类成员

现在我们创建一个C++文件student.cpp

//student.cpp -- implementing the Student class
//version 00
#include "stdafx.h"
#include "student.h"

Student::Student(){
}
Student::~Student(){
}
void Student::setChScore(int score){
    Student::ch = score;
}
void Student::setName(std::string n){
    Student::name = n;
}
void Student::setEnScore(int score){
    en = score;
}
void Student::setMathScore(int score){
    math = score;
}
//不需要知道这个方法的具体实现,后面会介绍,本节重点是类与对象
void Student::show(){
    Student::count();
    ios_base::fmtflags orig = cout.setf(ios_base::fixed,ios_base::floatfield);
    std::streamsize prec = cout.precision(1);
    cout<<name<<" 同学的语文成绩为"<<ch<<"分,数学成绩为"<<math<<"分,英语成绩为"<<en<<"分,平均成绩"<<average<<"分"<<endl;
    cout.setf(orig,ios_base::floatfield);
}

注意这个实现的Student::setChScore(int score)中我们在使用ch参数时使用了作用于解析运算符,其实在类的内部我们可以直接使用简称,所以在后续的方法中我们使用了非限定名。

默认的内联方法

我们在类的定义中声明并定义了一个count()方法,由于其位于声明中,编译器将其编译为内联方法。一般内容简单的方法都可以作为内联方法。如果我们并不想直接在定义中声明并定义一个内联方法,我们也可以在实现时给方法添加inline关键字。比如

    inline void count(){
        average = (ch + en + math+0.0F)/3;
    }

但是我们在声明外定义内联函数时必须注意C++中的一个规则:要求内联函数在每一个使用它的源文件中均由定义。也就是说我们需要在每一个使用该方法的文件中定义该方法,很明显我们并不想这样做,所以最好的实现就是在声明中实现定义方法。

创建对象

当我们在使用一个类的实例对象时需要用到一个关键字new,这个关键字和C语言中的malloc关键字类似,都是用来在堆内存中为数据分配一段空间。
我们在main方法中举个例子

//visual studio 2010 -- main program
#include "stdafx.h"
#include "student.h"

int _tmain(int argc, _TCHAR* argv[]){
    Student *jack = new Student();
    jack->setName("jack");
    jack->setChScore(98);
    jack->setMathScore(100);
    jack->setEnScore(92);
    jack->show();
    delete jack;
    return 0;
}

输出结果:

jack 同学的语文成绩为98分,数学成绩为100分,英语成绩为92分,平均成绩96.7分
请按任意键继续. . .
温馨提醒:记得养成良好习惯,在对象不用后要使用delete关键字销毁对象。
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值