目录
面向过程和面向对象的初步认识
类的引入
类的定义
类的访问限定符及封装
访问限定符
封装
类的作用域
类的实例化
类对象模型
如何计算类对象大小
结构体内存对齐规则
this指针
this指针的引出
this指针的特性
面向过程和面向对象的初步认识
C语言是面向过程的,其核心在于过程,通常分析出问题的步骤然后进行调用函数进行解决,过程中的每一步都需要进行手动操作实现。
C++是面向对象的,也就是关注的是对象并不关注对象是怎么实现的对应操作的。
以洗衣服为例子,对于面向过程而言整个过程就是用盆子接水->放衣服->放洗衣粉->手搓->倒水->接水->放洗衣粉->...
而对于面向对象而言,相对就没有这么繁琐了,对象就是人、洗衣机、衣服、洗衣粉,我将衣服放入洗衣机中放入洗衣粉,然后打开洗衣机就可以了。至于洗衣机是怎么洗衣服的我并不需要关注。
类的引入
typedef int DataType;
struct Stack
{
void Init(size_t capacity)
{
_array = (DataType*)malloc(sizeof(DataType) * capacity);
if (nullptr == _array)
{
perror("malloc申请空间失败");
return;
}
_capacity = capacity;
_size = 0;
}
void Push(const DataType& data)
{
// 扩容
_array[_size] = data;
++_size;
}
DataType Top()
{
return _array[_size - 1];
}
void Destroy()
{
if (_array)
{
free(_array);
_array = nullptr;
_capacity = 0;
_size = 0;
}
}
DataType* _array;
size_t _capacity;
size_t _size;
};
int main()
{
Stack s;
s.Init(10);
s.Push(1);
s.Push(2);
s.Push(3);
cout << s.Top() << endl;
s.Destroy();
return 0;
}
像这样的我们通常在C++中以类class实现。
类的定义
class className{// 类体:由成员函数和成员变量组成}; // 一定要注意后面的分号
成员函数。
class student
{
public:
void print()
{
cout << name << " " << scores;
}
private:
string name;
double scores;
};
class student
{
public:
void print();
private:
string name;
double scores;
};
在.cpp文件中需要访问类域:
void student::print()
{
cout << name << " " << scores << endl ;
}
类的访问限定符及封装
访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选
封装
类的作用域
类的实例化
类对象模型
如何计算类对象大小
先定义一个简单的类;
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
char _a;
};
类中既有成员函数又有成员变量,那么如何计算类的大小呢?
类的内存大小是指的类成员变量的所占的内存大小,成员函数并不计入在内;其计算方式与结构体的计算大小方式相同;不同的是如果一个类是空的那么他的大小不是0而是1;
结构体内存对齐规则
this指针
this指针的引出
先来定义一个日期类;
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
int main()
{
Date d1, d2;
d1.Init(2022,1,11);
d2.Init(2022, 1, 12);
d1.Print();
d2.Print();
return 0;
}
this指针的特性
class date
{
public:
void print()
{
cout << _year << "-" << _month << "-"<<_day;
}
private:
int _year;
int _month;
int _day;
};
class date
{
public:
void print()
{
cout << this->_year << "-" <<this-> _month << "-"<<this->_day;
}
private:
int _year;
int _month;
int _day;
};
二者等同。