C++分析类的对象作类成员调用构造与析构函数及静态成员

 更新时间:2022年05月27日 09:39:18   作者:对象new不出来  
终于到了对象的初始化和清理的最后阶段了,在这里分享一个cpp里有多个类时,一个类的对象作为另一个类成员的时候构造函数和析构函数调用的时机。还有一个静态成员也是经常考到的点,在这篇博客将会详解其概念并举出案例巩固,让我们开始

类对象作为成员

C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员

例如:

class Phone {}
class Person
{
    Phone p;
}

tips:当类中成员是其他类对象时,我们称该成员为 对象成员

Person类中有对象p作为成员,Phone为对象成员,那么当创建Person对象时,Phone与Person的构造和析构的顺序是谁先谁后?

那让我们在两个类中加上一些输出语句做提示就好了,可以清晰的看到构造和析构的顺序。

示例:

#include<iostream>
using namespace std;
//类对象作为类成员
class Phone
{
public:
	Phone(string P_name)
	{
		p_name = P_name;
        cout<<"Phone类有参构造"<<endl;
	}
    ~Phone()
	{
		cout << "Phone析构" << endl;
	}
	string p_name;
};
class Person
{
public:
	Person(string m_Name,string p_Name):m_name(m_Name),m_PName(p_Name) {
        cout << "Person构造" << endl;}//初始化列表
    ~Person()
	{
		cout << "Person析构" << endl;
	}
	string m_name;
	Phone m_PName;
};
void test01()
{
	Person p1("张三", "华为nova7");
	Person p3(p1);//调用默认拷贝构造函数
	p3.m_name = "李白"; p3.m_PName.p_name = "iphone MAX";
	cout << p1.m_name << "拿着" << p1.m_PName.p_name << endl;
	cout << p3.m_name << "拿着" << p3.m_PName.p_name << endl;
}
int main()
{
	test01();
}

从结果图中看出同时调用有参构造的时候,先调用对象成员的构造,再调用本类构造

析构的顺序相反

静态成员

定义和分类

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

静态成员变量

  • 所有对象共享同一份数据
  • 在编译阶段分配内存
  • 类内声明,类外初始化

静态成员函数

  • 所有对象共享同一个函数
  • 静态成员函数只能访问静态成员变量

静态成员变量

class Person
{
public:
	static int m_A; 
private:
	static int m_B; 
};
int Person::m_A = 10;
int Person::m_B = 10;
void test01()
{
	//静态成员变量两种访问方式
	//1、通过对象
	Person p1;
	p1.m_A = 100;
	cout << "p1.m_A = " << p1.m_A << endl;
	Person p2;
	p2.m_A = 200;
	cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据
	cout << "p2.m_A = " << p2.m_A << endl;
	//2、通过类名
	cout << "m_A = " << Person::m_A << endl;
	//cout << "m_B = " << Person::m_B << endl; //私有权限访问不到
}
int main() {
	test01();
	system("pause");
	return 0;
}

静态成员变量也是有访问权限的,无论是public或者是private在类内都可以被访问,m_A和m_B在类内定义在类外初始化,还记得类外初始化吗,就是变量类型加类名加::变量名=值;同时可以通过对象和类名两种方式访问静态成员变量。

静态成员函数

class Person
{
public:
	int getB()
	{
		return m_B;
	}
	static int m_A;
	int m_C;//非静态成员变量
	//静态成员函数
	static void func()
	{
		m_A = 100;
		//m_C = 20;
		cout << "static void func 的调用" << endl;
	}
private:
	static int m_B;
	static void func2()
	{
		cout << "static void func 的调用" << endl;
	}
};
int Person::m_A = 100;//类外外面初始化
int Person::m_B = 200;
void test03()
{
	//调用方式有两种
	//1、通过对象调用
	Person p;
	p.func();
	//通过类名调用
	Person::func();
	//类外访问不到静态成员函数,静态成员函数也有访问权限
}

静态成员函数也有权限的控制,代码里写了func是公共权限,func2是私有权限;静态成员函数也有对象调用和类名调用两种方式,但是都无法调用私有权限的静态成员函数。

注意事项:静态成员函数不可以访问非静态成员变量,无法区分到底是哪个对象的属性,只有公用的静态成员变量才可以被访问。

总结

热烈庆祝对象的初始化和清理完工,作为C++核心编程比较重要的一部分,我也是认真的总结了一遍,感觉很充实,下篇博客直指this指针和成员变量以及成员函数的存储问题,期待你的鼓励,下篇再见!

到此这篇关于C++分析类的对象作类成员调用构造与析构函数及静态成员的文章就介绍到这了,更多相关C++类的对象内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ STL 中的数值算法示例讲解

    C++ STL 中的数值算法示例讲解

    本片文章讲解了C++STL 中的数值算法,包含iota、accumulate、adjacent_difference、inner_product、partial_sum这些方法的使用,感兴趣的朋友来看看吧<BR>
    2022-04-04
  • 深入解析C++中的动态类型转换与静态类型转换运算符

    深入解析C++中的动态类型转换与静态类型转换运算符

    这篇文章主要介绍了C++中的动态类型转换与静态类型转换运算符,即dynamic_cast与static_cast的用法,需要的朋友可以参考下
    2016-01-01
  • C++实现读入二进制数并转换为十进制输出

    C++实现读入二进制数并转换为十进制输出

    本文给大家介绍的是一则使用C++实现读入二进制数并转换为十进制输出的代码,实现起来其实非常简单,C++本身就提供了二进制类库的,大家看代码吧,简单又实用。
    2015-03-03
  • Qt实现图形裁减

    Qt实现图形裁减

    这篇文章主要为大家详细介绍了Qt实现图形裁减,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 解析C++编程中virtual声明的虚函数以及单个继承

    解析C++编程中virtual声明的虚函数以及单个继承

    这篇文章主要介绍了C++编程中virtual声明的虚函数以及单个继承,剖析虚函数和单个基类所能够继承的成员,要的朋友可以参考下
    2016-01-01
  • MFC对话框中添加状态栏的方法

    MFC对话框中添加状态栏的方法

    这篇文章主要介绍了MFC对话框中添加状态栏的方法,实例分析了MFC对话框添加状态栏所涉及的相关成员变量与事件实现技巧,需要的朋友可以参考下
    2015-07-07
  • C语言实现通讯录功能

    C语言实现通讯录功能

    这篇文章主要为大家详细介绍了C语言实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言实现俄罗斯方块课程设计

    C语言实现俄罗斯方块课程设计

    这篇文章主要为大家详细介绍了C语言实现俄罗斯方块课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 一文带你深入了解Qt中的顺序容器类与关联容器类

    一文带你深入了解Qt中的顺序容器类与关联容器类

    Qt中也有很多容器类,他们在存取速度、内存开销等方面进行了优化,使用起来更轻量级、更便捷,下面就跟随小编一起来学习一下它们的具体使用吧
    2024-04-04
  • 详解C++循环创建多级目录及判断目录是否存在的方法

    详解C++循环创建多级目录及判断目录是否存在的方法

    这篇文章主要介绍了C++循环创建多级目录及判断目录是否存在的方法,文中代码有一个针对各种系统进行判断来加载不同头文件的方法,需要的朋友可以参考下
    2016-03-03

最新评论