定义类,类规范由两部分类声明和类定义两部分组成。一般情况下,类的声明定义放在头文件中,类的实现(类方法的代码)是放在源代码文件中。
-
类声明:已数据成员的方式描述数据部分,已成员函数(即方法)描述公有接口
-
类定义:描述如何实现成员函数
基础知识
- 成员函数可在在类声明中就地定义(此时该函数就成为内联函数),也可以使用原型声明。内联函数也可以在类外部实现,内联函数比较特殊,需要在每个使用到它的文件都对其定义,所以为了确保内联定义多文件程序的所有程序有效,所以内联函数要放在头文件中。类的内联函数定义如下:
inline type className::method(args) {
//实现
}
- 关键字
private
、public
和protected
是新的,描述了类成员的访问控制。如果不声明的话,默认为private
。通常,成员数据放在private
中,类的成员函数放在public
中。 - 实现类成员方法,需要使用类作用域运算符
::
来标志标志函数所属的类,且类方法可以访问private
组件。类函数实现如下:
type className::method(args) {
//实现
}
- 每一个对象都有自己的存储空间,用于存储内部变量和类成员,但同一个类创建的所有对象都共享同一个方法。
- 类的构造方法。类都有一个默认的构造方法,构造方法的名字和类名一样,且没有返回值。需要注意以下几点:
- 类的构造函数的参数名不能和类成员一样。
- 不能使用使用对象调用构造函数。
- 如果类定义了构造函数,但又想使用默认的构造函数,则必须为类提供默认构造函数
- 创建对象会调用构造函数,调用构造函数方式有三种。
- 方式一,显式使用:
Student student = Student("hbx", 24);
- 方式二,隐式使用:
Student student("hbx", 24);
- 方式三,New构造:
Student student = new Student("hbx", 24);
- 方式一,显式使用:
- 析构函数。当对象过期时,程序将自动调用析构函数,我们可以在析构函数中释放资源。例如,我们在构造函数中使用
New
操作符分配了内存,则应该在析构函数中使用delete
操作符释放资源。析构函数实现如下:
~className{
//释放资源等操作
}
- 当对象或对象指针声明为
const
时,调用的函数也需要声明为const
, 否则调用失败。这样做是为了避免调用函数时,函数会修改常量对象。只要类方法不修改调用对象,就应该将其声明为const
。const
函数声明方式如下:
type className::method(args) const
this
指针。this
指针用于指向正在调用方法的对象。
实例
如Student类的头文件Student.h:
//Student.h
#ifndef STUDENT_H
#define STUDENT_H
#include "string"
class Student{
private:
std::string mName;
int mAge;
public:
Student(Student &);
Student(std::string name="hbx", int age=24);
int getAge(){
return mAge;
};
std::string getName(){
return mName;
}
};
#endif
Student类的实现文件Student.cpp:
//Student.cpp
#include "Student.h"
#include "string"
Student::Student(std::string name, int age) : mName(name), mAge(age) {}
Student::Student(Student & student){
mName = student.mName;
mAge = student.mAge;
}