C++类和对象

类和对象

1、通过分析“对象”的属性和行为设计出一个类。
2、类就是数据类型

简单类型:只能表示一个属性(变量),C/C++内建数据类型
数组类型:可以表示多个属性(变量),类型必须相同
结构类型:可以表示多个属性(变量),但缺少行为
类类型:既能表示属性,也能表示行为,一种复合数据类型

3、对象就是类这种数据类型创建出的实例,相当于结构变量。

class Student
{
	成员变量;
	成员函数;
};
Student stu;

类的定义与实例化

类的一般形式

class 类名: 继承方式 父类
{
public/private/protected:	// 访问控制限定符
	成员变量;
	// 构造函数
	类名(形参表)
	{

	}
	// 析构函数
	~类名(void)
	{

	}
};

类的访问控制限定符

public:公有成员,在任何位置都可以访问
private:私有成员,只能在类(自己)的成员函数种访问。
protected:受保护成员,只能在类(自己)和子类种访问

类中的成员变量和成员函数默认是private,结构中的成员和成员函数默认是public。
注意:C++中类和结构的区别只有成员函数和成员变量的默认访问权限不同。

构造函数

1、什么是构造函数:类的同名函数就是构造函数,没有返回值
2、什么时候调用,谁调用,调用几次?

创建类对象时会被自动调用(每创建一个类对象就会调用一次),对象整个生命周期中一定会被调用一次,只能被调用一次。

3、负责干什么
成员变量的初始化,分配相关资源,设置对象的初始状态。

class 类名:继承方式 父类
{
	// 构造函数
	类名(形参表)
	{

	}
};

4、对象的创建过程

1、分配类所需要的空间,无论栈还是堆。
2、传递实参调用构造函数,完成如下任务:
	1、根据继承表依次调用父类的构造函数
	2、根据成员变量的顺序依次调用成员变量的构造函数
	3、执行构造函数体中的代码。
注意:执行构造函数的代码是整个构造函数的最后一步
要保证构造函数代码所需要的一切资源和先决条件在该代码执行前已经准备充分,并得到正确的初始化。

5、对象的创建方法

在栈上创建:类名 对象;	// 无参时不需要括号
			类名 对象(实参);
在堆上创建:类名* 对象指针 = new 类名;
			类名* 对象指针 = new 类名();
创建多个对象:
	类名 对象 = {(实参),(实参),(实参)};
	类名* 对象指针 = new 类名(n){类名(实参),类名(实参),类名(实参)};
注意:通过malloc创建的类对象不能调用构造函数
注意:通过new[]创建的对象,一定要通过delete[]释放。

6、类的声明、实现、调用

1、在头文件中声明
class 类名:继承方式 父类
{
	成员变量;
public/private/protected:	// 访问控制限定符
	// 构造函数
	类名(形参表);
	// 析构函数
	~类名(void);
	// 其他成员函数
	返回值 函数名(参数列表);
};
2、源文件实现类的相关函数
返回值 类名::函数名(参数列表)
{

}
3、调用时只需要导入头文件,然后与类函数所在的源文件一起编译即可。
注意:如果一个类内容不多,可以考虑在头文件中完全实现,也可以只在头文件中实现简单和成员函数。
注意:类中自动生成的函数,在源文件中实现时,也需要在头文件中声明。

构造函数与初始化列表

构造函数可以被重载

同一个名字的函数有多个版本

缺省构造函数

缺省构造函数是编译器自动生成的一个什么都不做的构造函数(唯一的作用就是避免编译错误)
注意:当类中实现一个有参构造后,缺省构造就不会再自动生成,如果有需要必须显式地写出来。

无参构造函数

无参构造未必时无参,当给有参构造的所有参数设置默认形参,调用这种构造函数就不需要传参。

注意:所谓的“编译器生成的某某函数”其实不是真正语法意义上的函数,而是功能意义的函数,编译器作为可执行指令的生成者,它会直接生成具有某项功能的二进制指令,不需要借助高级语言语义上的函数完成此任务。
注意:如果一个类A是其他类B成员变量,那么一定要保证它有一个无参构造,当B的构造函数执行时会先执行成员变量的无参构造,而此时类B是无法给类A成员变量提供参数的。

单参构造与类型转换

如果构造函数的参数只有一个,那么可能Test t = n;语句就不会出错,它会自动调用单参构造来达到类型转换的效果。
如果想禁止这种类型转换,需要在单参构造前加 explicit

初始化列表

为类成员进行初始化用的。
构造函数(参数1,参数2):成员1(参数1),成员变量2(参数2)…
通过初始化列表可以给类成员变量传递参数,以此调用类成员的有参构造。
初始化列表也可以给const成员、引用成员进行初始化。

注意:成员的初始化顺序与初始化列表没有关系,而是在类中的定义顺序有关。
注意:初始化列表运行时,类成员变量还没有定义成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值