服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++分析类的对象作类成员调用构造与析构函数及静态成员

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

2022-12-09 13:30对象new不出来 C/C++

终于到了对象的初始化和清理的最后阶段了,在这里分享一个cpp里有多个类时,一个类的对象作为另一个类成员的时候构造函数和析构函数调用的时机。还有一个静态成员也是经常考到的点,在这篇博客将会详解其概念并举出案例

类对象作为成员

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

例如:

?
1
2
3
4
5
class Phone {}
class Person
{
    Phone p;
}

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

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

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

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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();
}

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

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

析构的顺序相反

静态成员

定义和分类

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

静态成员分为:

静态成员变量

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

静态成员函数

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

静态成员变量

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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在类内定义在类外初始化,还记得类外初始化吗,就是变量类型加类名加::变量名=值;同时可以通过对象和类名两种方式访问静态成员变量。

静态成员函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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++类的对象内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_58618795/article/details/124935985

延伸 · 阅读

精彩推荐
  • C/C++浅析C语言中typeof关键字用法

    浅析C语言中typeof关键字用法

    typeof关键字是C语言中的一个新扩展。在linux内核源代码中广泛使用。接下来通过本文给大家分享C语言中typeof关键字用法,需要的朋友参考下...

    ComingFlying11092021-05-03
  • C/C++Python与C++ 遍历文件夹下的所有图片实现代码

    Python与C++ 遍历文件夹下的所有图片实现代码

    这篇文章主要介绍了 Python与C++ 遍历文件夹下的所有图片实现代码的相关资料,需要的朋友可以参考下...

    冰不语9232021-05-14
  • C/C++C语言使用顺序表实现电话本功能

    C语言使用顺序表实现电话本功能

    这篇文章主要为大家详细介绍了C语言使用顺序表实现电话本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    WANSNIM8802021-06-20
  • C/C++break的使用for循环嵌套示例

    break的使用for循环嵌套示例

    这篇文章主要介绍了break的使用for循环嵌套示例,需要的朋友可以参考下...

    C语言程序设计9642021-01-15
  • C/C++c语言abort函数实例用法

    c语言abort函数实例用法

    在本篇文章里小编给大家整理了一篇关于c语言abort函数实例用法及相关知识点,有兴趣的朋友们可以学习下。...

    pycn4992022-01-17
  • C/C++C语言的函数概念与规则你了解吗

    C语言的函数概念与规则你了解吗

    这篇文章主要介绍了C语言中的函数概念与规则,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助...

    宝全哥哥5412021-12-23
  • C/C++基于openCV实现人脸检测

    基于openCV实现人脸检测

    这篇文章主要为大家详细介绍了基于openCV实现人脸检测的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    liuph_8132021-06-15
  • C/C++仿写C语言string.h头文件检验字符串函数

    仿写C语言string.h头文件检验字符串函数

    这里给大家分享的是一个C语言string.h头文件检验字符串函数的仿写,非常的简单实用,小编觉得这篇文写的还不错,希望能够给你带来帮助...

    code-0163382022-02-22