《C++程序设计》阅读笔记【6--类(1)】

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:《C++程序设计》阅读笔记

本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C++程序设计获取下载链接。



1 类

1.1 概述

::叫作用域区分符,指明一个函数属于哪个类或一个数据属于哪个类。::可以不跟类名,表示全局数据或全局函数(即非成员函数)。

例如:

image-20240229184337682

TIP:函数声明一般在头文件,但是函数定义不能在头文件。

解释:函数声明通常放在头文件(.h文件)中。这样,在程序的其他部分,如不同的源文件,就可以通过包含头文件来知道函数的接口(函数名称、参数类型和返回类型)而无需知道具体实现细节。函数定义通常放在源文件(.c或.cpp文件)中。这是因为如果把函数定义放在头文件中,当头文件被多个源文件包含时,就会导致多重定义的问题。

一个类对象所占据的内存空间由它的数据成员所占据的空间总和所决定。类的成员函数不占据对象的内存空间。

解释:成员函数的代码是所有对象共享的,它们在类的代码段中,而不会在每个对象中复制一份。但是每个类的数据成员都是不同的,因此要为其分配空间存储。

在类的对象调用成员函数时,除了接受实参外,还接受了一个对象的地址。这个地址被一个隐含的形参this指针所获取,它等同于执行this=&s。所有对数据成员的访问都隐含地被加上前缀this->。所以调用共享的代码段但是却可以操作自己的数据。所有的非静态数据函数都隐含this指针。

类中的成员默认是私有(private)

稍微注意一下:类内初始值,也就是在类定义到时候给它初始化:

image-20240316162521793

在类定义内部定义的成员函数会被隐式地声明为内联函数

构造函数也可以是内联函数

注意:当成员函数在类中声明,但是在类外实现时,它就不是内联函数(但是它依然具有类作用域)

1.2 构造函数

注意一下构造函数的创建先后的问题:

#include<iostream>
using namespace std;

class stu{
public:
	stu(){
		cout<<"stu"<<endl;
	}
};

class teach{
public:
	teach(){
		cout<<"teach"<<endl;
	}
};

class tutor{
public:
	tutor(){
		cout<<"tutor"<<endl;
	}
	
	stu s;
	teach t;
};

int main(){
	tutor t;
	return 0;
}

结果:

image-20240229203828178

解释:

主函数运行开始时,遇到要创建tutor类的对象,于是调用其构造函数tutor(),该构造启动时,首先分配对象空间(包含一个stu对象、一个 teach对象,然后根据在类中声明的对象成员的次序依次调用其构造函数。这里先调用stu()构造兩数,再调用 teach()构造函数,最后才执行它自己的构造函数的函数体。按照这个顺序,分别产生运行结果的第一、第二、,第三行输出。

注意一下一个简单的知识点:委托构造函数

//Clock类的两个构造函数:
Clock(int newH, int newM, int newS) : hour(newH),minute(newM),  second(newS)  {	//构造函数
}
Clock::Clock(): hour(0),minute(0),second(0) { }//默认构造函数

那么,默认的构造函数可以这样写:

Clock(): Clock(0, 0, 0) { } //委托构造函数

1.3 析构函数

析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。它只是在类对象生命期结束的时候,由系统自动调用。

构造函数不同于析构函数,它可以有参数,可以重载

析构函数调用的顺序:正好和构造函数相反(先构造则先入栈,那么析构时就后出栈)

#include<iostream>
using namespace std;

class stu{
public:
	stu(){
		cout<<"stu"<<endl;
	}
	~stu(){
		cout<<"~stu"<<endl;
	}
};

class teach{
public:
	teach(){
		cout<<"teach"<<endl;
	}
	~teach(){
		cout<<"~teach"<<endl;
	}
};

class tutor{
public:
	tutor(){
		cout<<"tutor"<<endl;
	}
	~tutor(){
		cout<<"~tutor"<<endl;
	}
	stu s;
	teach t;
};

int main(){
	tutor t;
	return 0;
}

结果:

image-20240229204722953

TIP:

当主函数运行到结束的大括号处时,析构函数依次被调用。

1.4 重载构造函数

值得注意的知识点:

这四个重载的构造函数可以通过函数重载合为一个函数

image-20240229212512232

也就是:

image-20240229212612549

2 总结

C++,犹如编程的交响乐, 在代码的海洋中奏响和谐的旋律。

它是创造者的笔,雕刻着无尽可能,

是思想的翅膀,让梦想飞翔的天空。

无拘无束,灵活多变。

C++,是程序员心中的宝藏,永不凋零的花朵。

渴望挑战C++的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多C++的奇迹吧。我们推出了引领趋势的💻C++专栏:《C++程序设计》阅读笔记,旨在深度探索C++的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值