一、概述
1、什么是对象
(1)万物皆对象。
(2)程序就是一组对象,对象之间通过消息交换信息。
(3)类就是对对象的描述和抽象,对象就是类的具体化和实例化。
2、通过类描述对象
类就是从属性和行为两个方面对对象进行抽象。
属性:姓名、年龄、学号
行为:吃饭、睡觉、学习
3、面向对象程序设计(OOP)
(1)精通一种面向对象的元语言 —— UML。
(2)研究设计模式——GOF。
二、类的基本语法
1、类的定义
class 类名{};
1.1、成员变量 —— 属性
class 类名{
类型 成员变量名;
};
1.2、成员函数 —— 行为
类名{
返回类型 成员函数名(形参表){
函数体
}
};
如:
class Student{
string m_name;
int m_age;
void eat(const string& food){
...
}
};
2、访问控制属性
(1)公有成员:public,谁都可以访问。
(2)私有成员:private,只有自己可以访问。
(3)保护成员:protected,只有自己和自己的子类可以访问。
(4)类的成员缺省访控属性为私有,而结构体的成员缺省访控属性为公有。
#include <iostream>
using namespace std;
class Student{
private:
string m_name;
int m_age;
public:
void eat(const string& food){
cout << m_age << "岁的" << m_name << "同学正在吃" << food <<"。" << endl;
}
void setName(const string& name){
if (name == "2")
cout << "你才" << name << "!" << endl;
else
m_name = name;
}
void setAge(int age){
if (age < 0)
cout << "无效的年龄!" << endl;
else
m_age = age;
}
};
int main(){
Student student;
student.setName("张飞");
student.setAge(25);
student.eat("包子");
return 0;
}
3、构造函数
class 类名{
...
类名(形参表){
构造函数体;
}
};
当一个对象被创建时,构造函数会自动被执行,其参数来自构造实参。
(1)构造函数可以通过构造参数实现重载。
(2)如果一个类没有定义任何构造函数,那么系统就会缺省的为其提供一个无参构造函数,该构造函数对于基本类型的成员变量不做初始化,对于类类型的成员变量,调用其相应类型的无参构造函数初始化。
(3)对象的创建过程
分配内存 -> 调用构造函数
-> 调用类类型成员的构造函数 -> 构造函数的代码
4、初始化表
class 类名{
类名(...) : 初始化表{
构造函数体;
}
};
const int x = 100;
x = 100;
int& a = b;
a = b;
(1)如果类中含有常量或引用型的成员变量,必须通过初始化表对其初始化。
(2)成员变量的初始化顺序仅与其被声明的顺序有关,而与初始化表的顺序无关。
class A{
public:
A(char* psz) : m_str(psz), m_len(m_str.length()){}/*因为m_len先声明,故先初始化,但在初始化
m_len时,要用到m_str的长度,但m_str现在还不存在,故会出错*/
private:
size_t m_len;
string m_str;
};
//正确的做法是在初始化表中减少变量间的相互耦合,这里把m_str.length()改为strlen(psz)。
5、析构函数
class 类名{
~类名(void){
析构函数体;
}
};
当一个对被销毁时,自动执行析构函数。
局部对象离开作用域时被销毁,堆对象被delete时被销毁。
如果一个类没有定义任何析构函数,那么系统会提供一个缺省析构函数。缺省析构函数对基本类型的成员变量什么也不干,对类类型的成员变量,调用相应类型的析构函数。
一般情况下,在析构函数中释放各种动态分配的资源。
构造:基类-》成员-》子类
析构:子类-》成员-》基类
6、this指针
(1)一般而言,在类的构造函数或成员函数中,关键字this表示一个指针,对于构造函数而言,this指向正在被构造的对象,对于成员函数而言,this指向调用该函数的对象。
(2)this指针的用途
A、在类的内部区分成员变量。
B、在成员函数中返回调用对象自身。
C、在成员函数内部通过参数向外界传递调用对象自身,以实现对象间交互。
class A{
//B m_b;
B* m_b;
B& m_b;
};
class B{
A m_a;
};
sizeof(A) ?