C++第二篇 类和对象(上)


目录

1.类的定义

1.1类定义的格式

1.2访问限定符

1.3类域

2.实例化

3.this指针


1.类的定义

1.1类定义的格式

class为定义类的关键字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。定义在类面的成员函数默认为inline

1.2访问限定符

访问限定符有:public private protected

(1).public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访
问,protected和private大致是一样的。

(2).访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到 }即类结束。

(3)class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

(4).一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

简单的类:

#include<iostream>
using namespace std;

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d;
	d.Init(2024, 8, 1);
	return 0;
}

函数声明与定义分离:

编译器默认只会在局部和全局查找,如果不指定类域,编译器无法找到,所以要指定类域,编译器就会去类域找。
 

class Date
{
public:
	void Init(int year, int month, int day);
	
private:
	int _year;
	int _month;
	int _day;
};

void Date::Init(int year, int month, int day)//要指定类域
{
	_year = year;
	_month = month;
	_day = day;
}

1.3类域

类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作
用域操作符指明成员属于哪个类域。

2.实例化

声明和定义的区别:是否开辟空间,声明就是告诉变量是什么的类型等等,不开辟空间,而定义则开辟空间。

class Date
{
public:
	void Init(int year, int month, int day);
	
private:
	int _year;
	int _month;
	int _day;
};

在private中的_year,_month,_day都只是声明,不是定义。

实例化的定义:一个类可以实例化出n多个对象。Date d;就是实例化。

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d;//实例化
	d.Init(2024, 8, 1);
	return 0;
}

当有多个实例化时,比如说有1000个实例化对象,但是类是同一个类,类中的函数是否也重复存储了1000个呢?并不是这样,其实这些函数是指针,他们不在对象中存储对象中只存储成员变量成员函数存储在一个公共区域。编译时就会确定地址,当调用函数时,都是调用的同一函数

3.this指针

不同类之间调用同一函数,如何做到打印各自的值的?因为具有隐含的this指针

(1).编译器编译后,类的成员函数默认都会在形参第一个位置增加一个当前类类型的指针,叫做this指针。比如Date类的Init的真实原型为 void Init(Date* const this, int year,int month, int day)

(2).在调用时,会把当前类的指针隐式的一起传过去。同时在类中也会有隐式的this指针,比如在Date类中 ,本质是通过this->_year来访问的_year,只是当我们只写_year时,前面会隐式的添加this->。

class Date
{
public:
	void Init(int year, int month, int day)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	
private:
	int _year;
	int _month;
	int _day;
};

(3).C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

(4).this指针存储在栈区。


本篇完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mike!

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值