C++类型设计与实例化对象

本文介绍了C++中的类设计,包括类的定义、成员的访问属性、对象的创建与使用、构造函数与析构函数的功能以及this指针的作用。重点讲解了如何通过构造函数进行对象初始化,以及析构函数用于对象销毁的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.类的设计

客观世界往往是复杂的,很多时候要描述一个物体,就需要将好几种类型组合在一起,为了解决这个问题,c语言提供了struct用来设计自己的类型。在c++中,类和结构体一样,也是一种自己设计的数据类型,与结构体不同的是,结构体大多只是数据成员,而类中除了数据成员,还有去操作数据成员的成员方法。

也就是说,类是数据成员与其方法的一个集合

class Student       // 
{
private:
    int _id;        //
protected:
    int _snum;      //
public:
      //


};

class用来定义类,后面紧跟的是类名,类中的成员与方法有三个属性,分别是private(私有属性)protected(保护属性)和public(公有属性)。

在类的作用域外,不能够直接去访问类中的私有属性和保护属性。所以一般情况下,将类的数据成员定义为私有或保护,而对数据操作的函数(方法)定义为公有属性。

类的设计最关键的部分还是在于成员函数的设计,因为通过成员函数可以完成对私有或保护数据成员的操作。

类是一种数据类型,像int一样,在定义类的时候系统并不会给类分配空间,只有当类型实例化出对象后,才给对象分配空间。

2.对象的创建与使用

对象是类的实例,类在定义是系统并不分配内存空间,只有当类实例化出对象后,才为对象分配空间,因此,对象的创建与使用比较关键。

class Student
{
private:
	int _id;
	float _score;
public:
};

int main()
{
	Student stu;
}

这样就很简单的创建出来一个对象。可以看到Student类型中有俩个数据成员,分别是学号和成绩,如果想给stu的学号和成绩赋值的话,就牵扯到构造函数了。

3.构造函数与析构函数

构造函数没有返回值,他的函数名是类名。构造函数有三个作用:

1.创建对象(其实上面的代码创建对象就是调用了系统给的默认的构造函数)

2.为对象做初始化(赋值)

3.类型转换

class Student
{
private:
	int _id;
	float _score;
public:
	Student(int id,float score=0.0f):_id(id),_score(score)
	{}
};

int main()
{
	Student stu(2002,68.56);
}

构造函数的形参表中可以有缺省值。当定义对象的时候,系统会自动调用相匹配的构造函数来构建对象,冒号后面的是实例化表,对对象进行赋值。然后才会进入到函数体中。

对象的生存期内,只能被构建一次,也就是只会调用构造函数一次。

既然对象能被构建,肯定可以被销毁。当一个对象生存期结束后,系统会自动调用析构函数,用来销毁对象并且处理后续工作。

1.构函数名与类名相同,但在前面加上字符~,如: ~Student ()

2.析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数

3.一个类有一个也只有一个析构函数,这与构造函数不同。

4.对象注销时,系统自动调用析构函数

5.如果类说明中没有给出析构函数,则C++编译器自动给出一个缺省的析构函数、

析构的顺序是,先创建的对象最后被析构,和构造的顺序相反。

class Student
{
private:
	int _id;
	float _score;
public:
	Student(int id,float score=0.0f):_id(id),_score(score)
	{
		cout << "Create Student" << endl;
	}

	~Student()
	{
		cout << "Destory Student" << endl;
	}
};

int main()
{
	Student stu(2002,68.56);
}

4.this指针

this指针是一个很重要的概念,如果我们创建了好几个对象:
 

class Student
{
private:
	int _id;
	float _score;
public:
	Student(int id,float score=0.0f):_id(id),_score(score)
	{
		cout << "Create Student" << endl;
	}

	~Student()
	{
		cout << "Destory Student" << endl;
	}

	void Show_Student()
	{
		cout << "id: " << _id << "    score: " << _score << endl;
	}
};

int main()
{
	Student stu(2002,68.56);
	Student stu2(2023, 99.0);
	Student stu3(2000, 40.00);
}

当这三个对象分别调用Show_Student的函数时,函数如何知道此时是哪个对象在调用它呢?
其实当对象调用普通方法或者析构函数或者构造函数的时候,会将自己的地址作为第一个参数传递进去,而函数这边用this指针接受。并且函数后可以加const用来限制函数内部不可以对this指针所指向的值进行修改。

class Student
{
private:
	int _id;
	float _score;
public:
	Student(int id,float score=0.0f):_id(id),_score(score)
	{
		cout << "Create Student" << endl;
	}

	~Student()
	{
		cout << "Destory Student" << endl;
	}

	void Show_Student()const
	{
		cout << "id: " << _id << "    score: " << _score << endl;
	}
};

int main()
{
	Student stu(2002,68.56);
	Student stu2(2023, 99.0);
	Student stu3(2000, 40.00);

	stu2.Show_Student();
	stu.Show_Student();
}

 需要注意的是,静态函数与友元函数并没有this指针。

以上就是简单的类型设计与实例化对象

感谢阅读!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

g162512

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

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

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

打赏作者

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

抵扣说明:

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

余额充值