C++:类的定义、访问、大小以及this指针

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指针特性

  1. this指针的类型:类类型* const
  2. 只能在“成员函数”的内部使用
  3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this
    形参。所以对象中不存储this指针。
  4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户
    传递
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值