1.类的定义
1.1 类定义格式
1.class为定义类的关键字,stack是类的名字,{}中是类的主体,类结束后后面的分号注意不要省略。类体中的内容成为成员;类中的变量成为成员变量;类中的函数成为成员函数。
2.在C++中我们为了区分成员变量我们一般在成员变量的前面加上一个_但是也有别的习惯,具体要看每个公司的要求。
3.C++中struct也可以定义类,C++中也兼容C语言的用法,同时将struct升级成了类,但是这里struct跟class的区别就是class在没有明确是私有还是公有的时候默认为私有,struct则是默认为公有,所以我们在C++中我们通常使用class。
4.定义在类里面的函数默认为inline函数。
#include <iostream>
using namespace std;
class stack
{
//成员函数
void init(int n=4)
{
_a=(int *)malloc(sizeof(int)*n);
if(_a==nullptr)
{
perror(malloc fail!);
return;
}
capacity = n;
top = 0;
}
//插入
void push(int x)
{
_a[top++] = x;
}
private:
//成员变量
int* _a;
size_t capacity;
size_t top;
}
1.2访问限定符
1.1这里C++一种实现封装方式,用类将对象的成员变量和成员函数结合在一起,让对象更加完整,通过访问权限选择性的将其接口提供给外部的用户使用。
1.2public修饰的成员在类外面可以直接访问;protected和private修饰的成员在类外不能直接被访问,protected和public的区别要在后期我们才能体现出他们呢的区别。
1.3访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符作用域到}处截至。
1.4class定义成员没有被访问限定符修饰时默认为private,struct则是public。
1.5 一般访问限定符都会被限制为protected或者private,需要给别人使用的函数使用public。
2.1实例化
2.1实例化概念
1.1用类类型创建对象的过程,称为类的实例化, 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量.
//这里就使用上图创建的类来创建几个对象
int main()
{
stack st1;
stack st2;
return 0;
}
这里我们使用上吗stack这个类实例化出来了st1和st2两个对象。
2.2类的大小
类的大小这里我们可以借鉴C语言中的结构体内存对齐规则:
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8 - 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
3.this指针
3.1Date类中有init和print两个成员函数,函数体中没有关于不同对象的区分,当d1调用init和print函数时,该函数是如何知道应该访问d1对象还是d2对象呢?这里就存在一个隐含的this指针。
3.2编译器编译后,类的成员函数都会默认在形参的第一个位置,增加一个当前类型的指针,叫做this指针,像我们下面这段代码中Date类的Init函数的真是原型是:
void Init(Date const this,int year,int month,int day)*
3.3类的成员函数访问成员变量,本质都是通过this指针访问的,如init函数中给_year赋值,this->_year = year;
3.4C++规定不能在实参和形参的位置显示的写this指针(编译是编译器会处理),但是可以在函数体内显示使用this指针。
#include <iostream>
using namespace std;
class Date
{
public:
//void Init(Date* const this,int year,int month,int day)
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
Date d1;
Date d2;
d1.Init(2003,8,8);
print();
d2.Init(2014,6,7);
print();
return 0;
}
运行效果图。