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

    文章

    146

    浏览量

    6878
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83468
收藏 人收藏

    评论

    相关推荐

    C++软件工程师面试题

    1、 c++是面向对象的编程语言吗?C++中虚函数(virtual) 是什么?有什么好处? (1)C++不是纯面向对象的语言,C++是面向对象和过程的,因为
    发表于 03-01 16:23

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

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

    c++中冒号(:)和双冒号(::)的用法

    ()——————————————————————————————————————VC中如下::是C++里的“作用域分解运算符”。比如声明了A,A里声明了
    发表于 10-18 10:08

    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++用new和不用new创建对象区别是什么?

    起初刚学C++时,很不习惯用new,后来看老外的程序,发现几乎都是使用new,想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的
    发表于 11-05 07:27

    成员函数中const的使用,有什么注意事项?

    成员函数中const的使用,有什么注意事项?
    发表于 04-26 06:42

    如何把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

    为什么要用C++?

    的,最新版本可以支持到C++14,而且还有一点,Keil最近的大幅度更新(Keil早已被Arm收购,可以说Keil是Cortex-M系列的官方IDE了),其中针对C++的改进非常多,例如C++
    发表于 02-07 06:07