0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

讲一点Python类成员和C++类成员的构造区别

冬至子 来源:鸣鸣锣的小屋 作者:Maxwell Luo 2023-07-21 17:40 次阅读

>>> 背景

如果同时写两种类型语言的代码,难免有的时候会产生一点混淆,这也正是思维碰撞的时候。今天来讲一点Python类成员和C++类成员的构造区别。在C++里面,就要求把类成员显式地声明出来,这样才能够在构造函数里面对成员进行初始化,就如下所示。

class A
{
public:
    int n_;
    A(int n) : n_(n){}
};

如果使用python定义类的话,类成员的定义和初始化都放在了构造函数里面,少了那么一点仪式感,就如下面所示。

class Dog:
    def __init__(self, m):
        self.m_ = m

这个时候如果硬是要为python类先声明一个成员,从语法上也是可以的,如下所示。

class Dog:
    n_ = 0
    def __init__(self, n):
        self.n_ = n

这就引出了今天的问题,在python中像 n_ = **0 **这样的语句,到底是什么含义呢?

>>> 解释

其实在上述代码中,为classDog创造了一个类静态成员,该静态成员为类所有的数据。而 self .m_ = m 才是为类的实例所有的数据。通过类静态成员,可以管理一些实例无关的数据,比如某个数学类中的圆周率、已经创建的实例的个数等等。

如下面就通过 count** *** 这个类静态成员,统计了实例化的次数;注意这里使用了 Dog.count*** ** 来访问类静态成员,而不是 self.count**_**。


class Dog:
    count_ = 0
    def __init__(self, n):
        self.n_ = n
        Dog.count_ += 1


if __name__ == '__main__':
    for i in range(3):
        g = Dog(2 * i)
        print(Dog.count_, " n: ", g.n_)
>>
1  n:  0
2  n:  2
3  n:  4

相比而言,C++创建类静态成员的方法如下所示。使用关键字 static 来声明一个静态成员。对于非const类型的类静态成员,C++还要求在类外部进行初始化,如int Dog::count = 0 ; 。

注意下面这种统计构造次数的方法仅仅是统计了普通构造,并没有统计默认构造、拷贝构造或者赋值构造。通过析构函数可以看到,随着对象的过期,对象的个数也逐渐减少到归0了。

class Dog
{
public:
    static int count;
    int n_;
    Dog(int n): n_(n) { count++; }
    ~Dog() { count--; }
};


int Dog::count = 0;


int main()
{
    {
        Dog g1(0);
        cout < < Dog::count < < " n: " < < g1.n_ < < endl;
        Dog g2(2);
        cout < < Dog::count < < " n: " < < g2.n_ < < endl;
        Dog g3(4);
        cout < < Dog::count < < " n: " < < g3.n_ < < endl;
    }
    cout < < Dog::count < < endl;
}
>>
1 n: 0
2 n: 2
3 n: 4
0
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6957
  • python
    +关注

    关注

    55

    文章

    4777

    浏览量

    84404
收藏 人收藏

    评论

    相关推荐

    强大的matlab:在中实现static成员变量 (转帖)

    不需要使用MATLAB的定义了。可是如果应用MATLAB开发具有工程应用型的程序,使用面向对象编程会具有不可比拟的优势。懂C++的朋友应该都知道,C++个static
    发表于 03-07 10:42

    C++笔记004:C++通俗说—— C结构体复习

    ` 本帖最后由 tyyhmtyyhm 于 2018-5-12 09:37 编辑 C++通俗说—— C结构体复习核心:C++
    发表于 03-05 12:53

    vc的常用成员函数

    CRect:用来表示矩形的,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造
    发表于 08-02 06:33

    【微信精选】C++的精髓和继承就该这么理解!

    中的公有成员C++继承 以下例子:定义了个基base,定义了个子类sum,子类继承了基
    发表于 08-15 09:41

    如何把C++的源程序改写成C语言

    无所知对大家有好处,只是想说这种方法的与程序逻辑本身的无关性。下面对C++些特性,以及如何在c里实现或者替代,作些初步的探讨:说明
    发表于 07-08 20:51

    如何把C++的源程序改写成C语言

    无所知对大家有好处,只是想说这种方法的与程序逻辑本身的无关性。下面对C++些特性,以及如何在c里实现或者替代,作些初步的探讨:说明
    发表于 07-11 09:34

    如何把C++的源程序改写成C语言

    所要实现的功能还无所知。倒不是说无所知对大家有好处,只是想说这种方法的与程序逻辑本身的无关性。下面对C++些特性,以及如何在c里实现
    发表于 06-30 10:54

    如何把C++的源程序改写成C语言

    方法的与程序逻辑本身的无关性。下面对C++些特性,以及如何在c里实现或者替代,作些初步的探讨:说明:函数Ixx为xx的
    发表于 07-05 14:59

    如何把C++的源程序改写成C语言

    无所知对大家有好处,只是想说这种方法的与程序逻辑本身的无关性。下面对C++些特性,以及如何在c里实现或者替代,作些初步的探讨:说明
    发表于 07-07 09:31

    如何把C++的源程序改写成C语言

    无所知对大家有好处,只是想说这种方法的与程序逻辑本身的无关性。下面对C++些特性,以及如何在c里实现或者替代,作些初步的探讨:说明
    发表于 11-17 10:16

    成员函数与普通函数的区别研究

    本文的目的是研究成员函数与普通函数之区别,以及不同调用方式之间的区别,进而通过内联汇编语句模仿特定的调用,从而完成通过普通函数指针调用
    发表于 09-15 14:52 32次下载

    C++的继承访问级别学习总结(二)

    篇文章我们介绍了c++的继承学习总结;今天我们继续来分享c++的继承中的访问级别的学习总结。
    的头像 发表于 12-24 16:10 709次阅读

    EE-128:C++中的DSP:从C++调用汇编成员函数

    EE-128:C++中的DSP:从C++调用汇编成员函数
    发表于 04-16 17:04 2次下载
    EE-128:<b class='flag-5'>C++</b>中的DSP:从<b class='flag-5'>C++</b>调用汇编<b class='flag-5'>类</b><b class='flag-5'>成员</b>函数

    的申明和成员函数定义分离是什么

    前面我们学习了如何定义,以及如何使用成员,在前面我们把成员函数都定义在了的内部,接下来我们学习,如何把
    的头像 发表于 02-27 15:33 872次阅读

    探索C++的编程习惯与编程要点

    C++可以分为带指针数据成员与不带指针数据成员,complex就属于不带指针成员
    的头像 发表于 11-14 09:25 374次阅读
    探索<b class='flag-5'>C++</b>的编程习惯与编程要点