面向对象oop
- 面向对象, 是基于对象的概念, 以对象为中心, 以类和继承为构造机制, 来刻画客观世界, 模拟现实.
- 对象是由数据和容许的操作组成的封装体, 与客观实体有直接的对应关系
- 面向对象不是某一种语言的特性, 而不是一种编程思想
- 面向对象首先考虑数据, 不仅考虑如何表示这些数据, 还要考虑如何使用数据
类和对象
- 类是一种将抽象转换为用户定义类型的工具
- 将数据表示和操纵数据的方法组成一个整体
- 类的实例成为对象
- 类中的变量和函数成为成员
类的声明
- 使用class/struct关键字声明类型
- class方式声明的类型与struct声明的类型除了形式上的不同, 其区别还在于使用class声明的类型默认成员是私有的(private), 而struct声明的类型默认成员是公有的(public)
//LandOwner.h中
class LandOwner {
public:
LandOwner(); //默认构造函数
~LandOwner(); //默认析构函数
string name;
long score;
int cards[20];
void TouchCard(int); //摸牌
bool PlayCard(int); //出牌
void ShowScore(); //查看积分
}
//LandOwner.cpp中
LandOwner::LandOwner()
{
}
void LandOwner::TouchCard(int cardCount)
{
cout << "摸牌" << cardCount << endl;
}
LandOwner::~LandOwner()
{
}
创建对象
-
第一种实例化方式---在栈内存中创建, 类似声明变量
类型 对象名(参数列表); Student stu(); Student stu;
- stu对象由系统创建并释放, 不用担心内存泄漏
- 生命周期只在声明区域的大括号内
- 栈内存的优势是存取速度比较快, 缺点是存在栈中的数据大小与生存期必须是确定的, 缺乏灵活性
-
第二种实例化方式---在堆内存中创建, 使用new关键字
Student* p_stu1 = new Student(); Student* p_stu2 = new Student; auto* p_stu3 = new Student();
- 需要使用delete释放
- 使用灵活, 可以赋值给全局变量, 可以把对象作为函数的返回值返回
类的成员变量
//函数声明
class 类名 {
修饰符1:
变量类型 变量名;
修饰符2:
函数返回类型 函数名();
}
class LandOwner {
public:
string name;
long socre;
public:
void ShowScore();
}
//函数定义
//:: 作用域解析运算符
返回类型 类名::函数名()
{
//函数操作
}
void LandOwner::ShowScore()
{
}
访问修饰符
- public: 修饰的成员在任意地方都可以访问
- private: 修饰的成员只能够在类中或友元函数中访问
- protected: 修饰的成员可以在类中函数, 子类函数及友元函数中访问
构造与析构函数
构造函数
- 以类名作为函数名, 无返回值类型
- 初始化对象的数据成员, 类对象被创建时, 编译器为对象分配内存空间, 并自动调用构造函数以完成成员的初始化
- 构造函数的种类: 无参构造, 一般构造(重载构造), 拷贝构造
- 如果创建的类中未书写任何构造函数, 系统会自动生成默认的无参构造函数
- 如果书写了构造函数, 系统就不会再自动生成默认构造; 如果希望有一个无参构造函数, 需要自己显示地书写出来
类名::构造(类型 参数)
{
//相关初始化代码
}
Student::Student(string name, string desc)
{
m_name = name;
m_desc = desc;
}
//可以简写
Student::Student(string name, string desc) : m_name(name), m_desc(desc)
{
}
Student* stu = new Student("大白", "超能陆战队");
析构函数
- 对象过期时自动调用的特殊成员函数
- 析构函数一般用来完成清理工作
- 析构函数的名称是在类名前加
~
- 析构函数没有参数, 且只能有一个
- 析构函数用来释放对象使用的资源, 并销毁对象的非static数据成员
- 无论何时一个对象被销毁, 都会自动调用其析构函数
class Student {
private:
double* scores;
public:
Student(int len)
{
//分配资源
scores = new double[len];
}
~Student()
{
//释放资源
delete scores;
}
}
this指针
- 每个成员函数, 包括构造和析构函数, 都有一个this指针
- this指针指向调用对象, 即可以通过this关键字访问当前对象的成员
- this指针类型为
类名* const
, 为右值 - this指针本身不占用大小, 它并不是对象的一部分, 因此不会影响sizeof的结果
- this的作用域在类成员函数的内部
- this指针是类成员函数的第一个默认隐含参数, 编译器会自动维护传递, 类编写者不能显式传递
- 只有在类的非静态成员函数中才可以使用this指针, 其他任何函数都不可以
- this指针可以用来返回当前对象的引用
//访问成员变量
this->成员名;
//访问成员函数
this->函数名();
class Student {
public:
Student& addScore(int score);
}
Student& Student::addScore(int score){
this->score = this->score + score;
return *this;
}