C++类与对象的详细说明

 更新时间:2022年02月17日 16:13:46   作者:树獭想吃饭  
这篇文章主要为大家详细介绍了C++的类与对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

类的引入

在引入类之前,先来回忆一下C语言中的结构体。结构体是一种自定义类型,可以在其中定义变量,如我们所熟悉的日期结构体:

struct Date
{
	int year;
	int month;
	int day;
};

而在C++中,结构体被升级成了类,结构体中不仅可以定义成员变量,也可以定义成员函数(成员方法):

struct Date
{
	//成员变量
	int year;
	int month;
	int day;
	//成员方法
	void print()
	{
		cout << year << "-" << month << "-" << "day" << endl;
	}
};

在C++中,更喜欢使用class来替代struct,当然它们也有所差别,在之后会说明。

类的定义

类的定义可以分为两种,即声明和定义全部放在类体中与声明与定义分离。

1、声明和定义全部放在类体中

该方式即为上一举例代码的定义方式。但要注意,如果采用这种方法定义成员函数,编译器可能会将该函数作为内联函数处理。

2、声明放在头文件,定义放在源文件中

头文件中成员函数只需要声明:

struct Date
{
	//成员变量
	int year;
	int month;
	int day;
	//成员方法
	void print();
};

在源文件中对函数进行定义:

void Date::print()
{
	cout << year << "-" << month << "-" << "day" << endl;
}

需要注意,print为类域中的函数,如果不加Date::用以指定类域,会导致定义出错。因此,使用该方式定义成员函数时,一定要注意指定类域。

类的访问限定符号及封装

访问限定符

访问限定符分为三种:

(1)public修饰的成员在类外可以直接被访问:

class Date
{
public:
	int year;
	int month;
	int day;
	void print()
	{
		cout << year << "-" << month << "-" << "day" << endl;
	}
};
int main()
{
	Date date;
	date.day = 0;
}

如上代码,在main函数中可以直接对对象中的成员变量day进行访问。

(2)protected和private修饰的成员变量在类外不能被直接访问

class Date
{
private:
	int year;
	int month;
	int day;
	void print()
	{
		cout << year << "-" << month << "-" << "day" << endl;
	}
};
int main()
{
	Date date;
	date.day = 0;
}

此时如果在main函数中对直接对象中的成员变量day进行访问,会导致错误

 (3)访问权限作用域是从该访问限定符的位置开始直到下一个访问限定符出现时为止

class Date
{
private:
	int year;
	int month;
	int day;
public:
	void print()
	{
		cout << year << "-" << month << "-" << "day" << endl;
	}
};

如上代码,成员变量均为私有的,而成员函数print为公有的。

(4)class的默认访问权限(即不写访问限定符时)为private,struct为public

封装

封装实际上是一种更好的严格管理

将数据和方法封装到类里,可以访问的定义为共有,不想给他人访问的定义为私有或保护。如此一来就做到了隐藏对象的属性和细节,仅仅对外公开接口来和对象进行交互,更加安全高效。

类的实例化

所谓类的实例化,简而言之就是用类类型创建对象的过程。

打个比方,类就好似建筑的图纸,而对象就是根据图纸造出的建筑。对象是真实存在摸得着的,只有实例化出的对象才能够实际存储数据。

类对象模型

学过C语言我们知道如何计算结构体的大小,那么在C++中,类的大小如何确定呢?

我们所不清楚的,就是类中成员函数的大小如何计算。实事上对于同一类的不同对象,处理问题的方法是相同的,如果每个对象都要保存一遍成员方法,未免有些过于浪费空间了。

因此在C++中,成员函数存放在公共代码段。计算类的大小只需要按照C语言中结构体大小的计算规则即可,不需要考虑成员函数。

注意:空类的大小为1byte,不存储有效数据,但需要占位用以表示对象存在。

this指针

class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	void init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
};
int main()
{
	Date date1, date2;
	date1.init(2022, 2, 14);
	date2.init(2022, 2, 15);
}

对于上述代码,有一个问题,date1与date2这两个对象分别都调用了init进行初始化,那么init函数是如何区分该为哪个对象进行初始化的呢?

C++通过引入this指针解决了这个问题。

this指针的特性

1、this指针的类型:类类型* const,存放对象的地址

2、只能在成员函数内部使用

3、this指针本质上是成员函数的形参,传参时存放在栈帧中,对象中不存储this指针

4、this指针为隐藏的形参,不需要用户传递

在上述代码实际被处理成了这样:

void init(int year, int month, int day)
{
	this->_year = year;
	this->_month = month;
	this->_day = day;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!    

相关文章

  • Visual Studio 2019安装使用C语言程序(VS2019 C语言)

    Visual Studio 2019安装使用C语言程序(VS2019 C语言)

    这篇文章主要介绍了Visual Studio 2019安装使用C语言程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧
    2018-10-10
  • C++实现从数组中同时取出最大最小元素算法示例

    C++实现从数组中同时取出最大最小元素算法示例

    这篇文章主要介绍了C++实现从数组中同时取出最大最小元素算法,结合具体实例形式分析了C++通过数组的遍历、排序获取最大与最小元素的相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 详解C语言中的符号常量、变量与算术表达式

    详解C语言中的符号常量、变量与算术表达式

    这篇文章主要介绍了C语言中的符号常量、变量与算术表达式,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • C++ 轻量级对象JSON序列化实现详情

    C++ 轻量级对象JSON序列化实现详情

    本文以jsoncpp库为基础,设计这样一个可以支持一个函数 可以一行代码 unmarshal /marshal 对象,需要的朋友小伙伴可以参考以下
    2021-09-09
  • C++ 深入浅出探索模板

    C++ 深入浅出探索模板

    人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是 C++ 引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动
    2022-04-04
  • vs2019 MFC实现office界面的画图小项目

    vs2019 MFC实现office界面的画图小项目

    本文主要介绍了vs2019 MFC实现office界面的画图小项目,对大家入门有一定的帮助,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • C语言超详细i讲解双向链表

    C语言超详细i讲解双向链表

    在实际生活中,我们用到的最多的两种链表结构就是单链表和双向带头链表,上一篇已经介绍了单链表的实现以及一些应用,接下来我为大家详细介绍一下双向链表,以及一些链表oj题
    2022-05-05
  • C语言静态链表和动态链表

    C语言静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式。静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表。
    2016-05-05
  • Qt使用QChart实现动态显示温度变化曲线

    Qt使用QChart实现动态显示温度变化曲线

    Qt的QChart是一个用于绘制图表和可视化数据的类,提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,所以本文就将使用QChart实现动态显示3个设备的温度变化曲线,感兴趣的可以了解一下
    2023-06-06

最新评论