C++作为面向对象的编程语言,需要用一个东西来描述对象,把对象的特点都包含进去,然后对对象进行操作,这个描述对象的东西就是类
类的定义
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
一个类中不仅可以定义变量,也可以定义函数
class Date {
public:
void show() {
cout << _year << _month << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
- 第一种是这样得,函数在类中直接定义
- 第二种是这样的,在类中定义,在类外实现。 一般情况下更推荐第二种。
- 类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
类的访问
类中的public和private指的是公共与私有的意思,public下面的函数或变量可以在类外被访问,而私有的不可以被访问,还有protected也不可以被访问。这就是面向对象语言的一个特点,封装
在类外访问类内成员时需要加上访问限定符 ::,就像上面那样,定义类内的函数,也要加上访问限定符。
class中成员默认状态是prvate类的大小
类的大小也遵循内存对齐原则- 第一个成员在与结构体变量起始地址偏移量为0的地址处
- 其他成员要对齐到某个数字(对齐数)的整数倍的地址处。
- 对齐数 = 编译器默认对齐数与该成员大小的较小值(vs默认8,Linux默认4);如果是聚合数据类型(数组和结构体),对齐数为该聚合类型中成员的最大对齐数。
- 结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍。
注意,类中的函数并不占在类的空间内,而是存放在公共的代码区
空类的大小为1字节
class Date {
public:
void show() {
cout << _year << _month << _day << endl;
}
int _year;
int _month;
int _day;
};
class person {
};`
void TestSize() {
Date d1;
person d2;
cout << "d1: " << sizeof(d1) << endl;
cout << "d2: " << sizeof(d2) << endl;
}
int main()
{
TestSize();
return 0;
}
this指针
class Date {
public:
Date (int year = 2021, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
void show() {
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
void Testthis() {
Date d1;
Date d2(2020,12,31);
d1.show();
d2.show();
}
int main()
{
Testthis();
return 0;
}
在这个例子中,分别调用d1和d2的show函数,分别输出了d1的值和d2的值,但是调用的时候并没有传递任何参数,看上去两次调用没有任何区别,那函数是怎么区分d1和d2的?
这是因为虽然我们没有显示传递任何参数,但是编译器会自主的在每一次成员函数的调用时传递一个参数,this指针,这个指针就指向调用函数的变量,可以的访问到该变量中的成员变量,因此两次调用函数输出的就是不同的值。
class Date {
public:
Date (int year = 2021, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
}
//void show(Date* this) {
// cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
//}
private:
int _year;
int _month;
int _day;
};
void Testthis() {
Date d1;
Date d2(2020,12,31);
//d1.show(d1);
//d2.show(d2);
}
int main()
{
Testthis();
return 0;
}
相当于这份代码,不过this指针不需要我们自己传递,编译器自己传。
this指针特性
- this指针的类型:类类型* const
- 只能在“成员函数”的内部使用
- this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this
形参。所以对象中不存储this指针。 - this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户
传递