C++|C++中的类与对象

C++中的类与对象 标签(空格分隔): c++
作者:陈小默

  • C中的类与对象
    • 定义类
      • 创建头文件
      • 类和结构体
    • 访问控制
    • 作用域解析运算符
    • 实现类成员
      • 默认的内联方法
    • 创建对象

开发环境:Visual Studio 2010

定义类 通常,C++程序将接口(类定义)放在头文件中,并将实现(类方法的代码放在源代码文件中),本文章以一个学生的例子来完成代码。
学生定义:记录三门课程(语文,英语,数学)的成绩,能够查看学生的平均成绩

创建头文件
现在创建名为student.h的头文件
//student.h -- Student class interface //version 00 #ifndef STUDENT_H_ #define STUDENT_H_#include 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
关键字 含义
private C++中的默认访问权限,也就是说上述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<

注意这个实现的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; }

【C++|C++中的类与对象】输出结果:
jack 同学的语文成绩为98分,数学成绩为100分,英语成绩为92分,平均成绩96.7分 请按任意键继续. . .

温馨提醒:记得养成良好习惯,在对象不用后要使用delete关键字销毁对象。

    推荐阅读