1 概述
C++是面向对象的语言,面向对象语言三大特性:封装、继承、多态。
C++将万事万物抽象为对象,对象上有其属性和行为。
2 封装
2.1 封装的意义
封装是面向对象的三大特性之一,封装将属性和行为作为一个整体,对属性和行为加以权限控制。
创建类语法:
class 类名 {
访问权限:
属性;
行为;
};
示例:
class Student {
private:
string m_name;
int m_age;
public:
Student(string name, int age) {
m_name = name;
m_age = age;
}
string getName() {
return m_name;
}
};
上面除了定义属性和行为,也定义了权限访问控制符
C++包含三种访问控制符:
- public 可被类中函数、子类函数、友元函数和类对象访问
- protected 可被类中函数、子类函数、友元函数访问
- private 可被类中函数和友元函数访问
2.2 struct和class区别
二者的区别在于默认的访问权限不同,struct默认访问权限为public,class默认访问权限为private
#include <iostream>
using namespace std;
class C1 {
int m_A;
};
struct S1 {
int m_A;
};
int main() {
C1 c1;
//c1.m_A; 报错,无法访问
S1 s1;
s1.m_A = 10;
return 0;
}
2.3 成员属性设置为私有
通常,将成员属性设置为私有,并提供设置和获取的方法。
这样的好处是可以控制成员属性的访问权限,对于写权限,能够检测数据的有效性。
class Test {
public:
//num1提供读写接口
void setNum1(int num1) {
m_num1 = num1;
}
int getNum1() {
return m_num1;
}
//num2只提供读接口
int getNum2() {
return m_num2;
}
//num3只提供写接口,并判定数据范围
void setNum3(int num3) {
if (num3 > 0) {
m_num3 = num3;
} else {
m_num3 = 0;
}
}
private:
int m_num1;
int m_num2;
int m_num3;
};
封装的思想通常会将属性设置为私有,暴露必要的修改行为给外部。
3 对象创建和清理
3.1 构造函数和析构函数
一个类具有最基础的两个函数是构造函数和析构函数,即使程序员未添加这两个函数,编译器也会生成一个默认的版本。
其中构造函数用于为类创建一个对象,并进行一些初始化的工作。
析构函数与构造函数相反,是为了清理一个对象,并释放资源。
构造函数和析构函数都是由编译器自动调用。
class Test {
private:
int m_num;
public:
Test();
Test(int num) {
m_num = num;
}
~Test();
};
构造函数可以重载,而析构函数只能有一个。构造函数可以通过传入不同的参数来重载,而析构函数没有参数。
当未定义构造函数和析构函数时,编译器会自动生成以下两个实现:
Test(){
}
~Test(){
}
默认会生成两个空实现。
而如果提供了有参构造函数,则编译器不会提供默认的空参构造函数,如果有此使用场景,则需要自己再提供一个空参构造函数。
3.2 构造函数分类及调用方式
构造函数有两种分类方式:
按参数分为:有参构造和无参构造
按类型分类:普通构造和拷贝构造
三种调用方式:
括号法
显示法
隐藏转换法
#include <iostream>
using namespace std;
class Person {
public:
//无参构造函数
Person() {
cout << "无参构造函数" << endl;
}
//有参构造函数
Person(int age) {
cout << "有参构造函数" << endl;
m_age = age;
}
//拷贝构造函数