python和C++技术对比

【python】详解类class的继承、__init__初始化、super方法:
https://blog.csdn.net/brucewong0516/article/details/79121179
备注:C++以11版本为基础,python以python3为基础
第一部分.语言的初级运用

python对于数据类型的处理特别灵活,使用python写的类是天然的模板类,使用python写的函数是天然的模板函数,不过这也产生了很多的陷阱。我个人感受而言,python是一种使用简单,但是理解上比较难的语言,因为它的很多功能都已经封装好了,从表面上看不出它实现的原理。但是C++是一种使用难但是理解起来简单的语言,是因为使用C++很多的类型是需要自己去构建的。

一、内置类型
Python的内置类型有:
Python的数据类型主要要分清楚类型的不可变性和可变性的特质(一度认为这个不太好理解。)
数字(包括整数、分数、小数、浮点数,具有不可变性);
字符串(单引号‘str’和双引号“str”都可以,具有不可变性);
集合({‘set’,‘set’},集合具有唯一性,就是集合里面的元素只能出现一次,具有不可变性);
元祖((tuple),可以任数据类型意嵌套,具有不可变性);
列表([list],可以任意数据类型进行嵌套,具有可变性,与元祖最大的区别就是它具有可变性);
字典(dir{‘key’:‘’},字典的键值对,值可以进行任意数据类型嵌套,具有可变性,但没有顺序性);
其他数据类型:None、布尔型。

C++的数据类型:
C++数据类型不是其编程的重点,在STL库中可以重点关注string、vector等,包括STL中的各种容器,自定义的类都可以看做是一种数据类型(个人认为);还有需要注意的是C-风格字符串和string类字符串的区别。
C++数据格式还有结构struct、共用体union、枚举enum、

二、函数传值、传引用和传指针的一些概念
Python:
1、python中的一个重要思想就是类型属于对象,而不是变量,变量指向对象,当变量赋给另一个值时,该变量指向另一个对象。
例如:a = 5 变量a指向对象5。
a = 10 变量a指向对象10,对象5因为没有其他变量指向它,因此被自动销毁。
2、python中数据的嵌套使用要注意,特别是可变类型的嵌套使用,一个变量的改变会改变另一个变量的值。也即是python中赋值生成引用,而不是拷贝。
例如:a = [1,2,3]
b = [a,2,3] 此时b=[[1,2,3],2,3]
若a[1]=99 此时b=[[1,99,3],2,3]
3、python函数参数值的传递。在参数的传递过程中,不可变参数“通过值(如C++中的传值)”进行传递,如数字、字符串。可变参数通过“指针”(如C++中的传指针或传引用)进行传递可变类型在函数中会改变参数的值,类似于C++中的传指针或传引用。
例如:def Change(a,b):
a = 2;
b[0] = ‘spam’
X = 1
L = [1,2]
Change(X,L) 此时X=1不变,L=[‘spam’,2]被改变
因为整数为不可变量,当给变量a赋值时,a会指向另外一个对象。
4、函数的参数。C++中主要分为按值、按指针和按引用传递参数;python中分为按不可变参数和可变参数来进行参数的传递。其中python中的参数传递更为灵活,
支持关键字参数传递(C++不支持):def func(a=1,b=2,c=3)
支持任意个数参数传递(C++不支持)def func(arg)(元祖参数) def func(**arg)(字典参数)
Python中万物皆是对象,竟然可以将函数当做参数进行传递;
Python中的keyword-only参数,只能进行关键字参数的传递,在参数列表中位于
arg之后,例如func(a,*b,c),则c只能使用关键字参数进行传递

三、有关作用域关键词
在python中,作用域关键词有global、nonlocal
global关键词:代表该模块的全局变量申明,函数中使用global申明,代表该变量的作用域在是全局变量;
nonlocal关键词(只在opencv3中可以使用):作用与global一样,只不过nonlocal指的是嵌套中函数的申明,作用域与global不一样。
lambda表达式:

在C++中,作用域关键词有(静态存储持续性)static、(动态存储持续性)new、(线程存储持续性)thread_local、自动持续变量(在代码块内,无关键词修饰)。重点介绍静态变量。
静态变量分为外部链接性(没有static修饰的全局变量)、内部链接性(有static修饰的全局变量)和无链接性(有static修饰的局部变量,相对于局部变量在程序巡行阶段会一直存在。)三种特性。
1、外部连接性,在其他文件或者是函数内部中如果要使用该变量,应使用使用申明关键字extern。用于文件之间各个位置的数据共享。
2、内部连接性,有关键字static进行限定,只在本文件中有用。如static int a;此外,内部静态变量也可以屏蔽外部的同名变量。用于文件内部各个位置的数据共享。
3、无连接性。在函数内部或代码块定义的static变量,无连接性,但是始终存在于内存当中。因此若该变量在函数内部,则每次调用都不会对该变量进行初始化,只会在第一次调用时初始化一次。
例如:int add()
{
static int a = 0;
a += 5;
return a;
}
int main()
{
for (int i = 0; i < 5; i++)
{
cout << aadd() << endl;
}
return 0;
}
输出为:5,10,15,20,25;

四、迭代器
Python中的迭代器是针对可迭代对象而言的,包括列表、元祖、字符串、文件、字典等。注意:文件是自己的迭代器,其他内置类型不是自己的迭代器。对于本身不是迭代器的类型对象,必须使用iter来启用迭代,并且支持多次打开迭代器:(下面是手动打开迭代器的方法)
例如:L = [1,2,3]
I = iter(L) I是L的迭代器
自动迭代的方法,使用for循环
例如:for i in L:
Python中迭代协议更多的使用在列表解析的功能中,并且使用列表解析速度非常之快。应该熟练使用列表解析。
例如:L = [1,2,3,4]
K = [x+10 for x in L]
有很多的python内置函数使用到了迭代协议,如range(),map(),zip(),filter()等一些内置函数,返回的都是一个迭代器,但是range()本身不是迭代器。
Python的生成器函数:yield关键字。yield关键字定义了生成器函数,生成器函数支持迭代协议(即可看做是一个迭代函数)。生成器函数一次只生成一系列值中的一个值。由此还有生成器表达式,其形式和列表解析一样。但是生成器表达式是括在括号里面的。值得注意的是,生成器函数和生成器表达式其自身就是迭代器,只支持一次活跃迭代。生成器函数和生成器表达式的作用就是能够编写自己的迭代器类型。
例如:G=(x**2 for x in range(5)),G是一个生成器对象,支持迭代协议,可以使用next(G)。

在C++中,STL类型中都有自己内置的迭代器,可以使用内置的迭代器对其进行访问。作用和使用方法暂时没有过多的了解??
C++迭代器值STL库中的重要部分,可以将它看做是一种指针,并且能够进行++、–等操作。迭代器主要的解决的问题是针对不同的容器可以使用同样的迭代方法进行操作,增加了代码的重用性。例如STL中的算法就是通过迭代器来处理不同类型的容器的。

第二部分.语言的高级运用
五、面向对象的编程——类的基础知识
C++的类知识是C++面向对象编程的基础。C++类的基础知识包括C++类的构造函数、析构函数、赋值构造函数、赋值运算符重载、类的友元函数与重载的关系、类的转换函数(将单个值转换成类需要有相应的类构造函数)等一些基本知识。注意:
1、C++的静态类成员在使用之前一定要进行初始化,还有静态类成员函数的使用;
2、构造函数中使用new的一些注意事项,一定要配套的使用析构函数进行释放;
3、函数的参数和返回值应尽量使用引用传递,可以减少副本的生成和销毁,使运行效率更高;
4、类的运算符重载用于方便类的运算,可以使用友元函数促进运算符重载的开发。

Python中的类也是使用class关键字进行定义的。Python中的私有成员和函数是由两条下划线__开始的,例如__name就代表私有成员,歧视这是一种伪私有成员,只是被编译器翻译成了_classname__name。由一条下划线开始的是类的保护成员。Python的内存是自动进行管理的,肯定就不需要析构函数了。对于python的复制构造函数,可以考虑使用__copy__和__deep__copy__的方法进行复制或深度复制。
1、python的构造函数__init__(self)、析构函数__del__(self)、静态变量(静态变量位于累的全局申明中,并且只有使用类名进行调用才是静态变量,可以供所有实例共享)
例如: class base:
Static_num=0 #静态变量
def init(self):
base.Static_num += 1 #静态变量的使用

2、python中类的动态变量(如C++中new出来的动态变量)该如何申明与使用??或者说python中有没有这种动态变量的概念?
3、Python中的运算符重载。C++中运算符重载是使用operator关键字和符号的形式进行重载的,python是使用特定的函数名对符号进行重载的。
4、python中不支持函数的重在。因此每个构造函数只能有一个构造函数。但是构造函数可以接收多种类型的和数量的参数,也就实现了构造函数的多态性。

六、面向对象的编程——类的继承

C++中类的继承分为公有继承、私有继承和保护继承。讲的就是基类与派生类的故事。
1、派生类要有自己的构造函数,并且派生类构造函数必须使用基类的构造函数(一般使用成员初始化列表的操作)
2、基类指针可以指向派生类,但是派生类指针不能指向基类,同样的派生类可以复制给基类,但是基类不能复制给派生类。因为派生类有基类的全部成员,所以可以复制过去;但是基类只有派生类的部分成员,所以不能复制过去。
3、多态公有继承。派生类的方法重新定义了基类的方法。如果要使用基类指针来调用基类和派生类的方法,这个时候就需要虚函数了。虚函数是根据指针指向的类对象来调用方法的,非虚函数是根据指针的类型来调用方法的。
4、析构虚函数的使用,派生类如果是new出来的,在delete时需要调用对应类的析构函数,这时候就用到了虚析构函数。
5、Protected属性的成员。带有protected属性的成员和成员函数主要是供派生类使用的。基类的protected成员可以供派生类使用,但是不能供外部使用。
6、当派生类使用new进行动态内存分配时,需要单独为派生类定义显示的复制构造函数、析构函数和赋值运算符。派生类的析构函数会自动调用基类的析构函数,所以不需要显式调用基类的机构函数,只需要delete掉派生类中的new的变量。
7、注意友元函数的继承问题

七、面向对象的编程——代码重用
1、包含和私有继承,一般使用包含的关系。
2、多重继承,多重继承可能会造成二义性的情况,可以使用虚基类的方法进行有效避免。
3、模板类,适用于多种类型数据的类。使用template class name{};进行申明。在使用类模板中,要注意指针类数据的通用性。
4、模板类的表达式参数(又叫非类型参数),主要解决的是使建立指定长度的数组更加方便和高效,减少了使用new和delete来进行内存管理的开销,但是数组长度一旦确定就不能进行改变。
5、模板类可以作为另一个模板类的成员,作为对比,一个函数里面不能定义另一个函数,这是C++的一个特性。
6、模板类和友元函数的使用。

八、面向对象的编程——友元、异常和其他
1、友元类,一个类作为另一个类的友元。不管是友元函数还是友元类,都是提供一种使外部方法能够访问内部数据的方案。例如遥控类和电视机类,遥控类需要能够访问电视机类的数据,因此使用遥控类作为电视机类的友元是一个很好的解决方案。
2、交互式友元类,两个类互相能访问对方的成员数据。
3、嵌套类。
4、智能指针。指针在使用过程中很容易忘记delete掉用new生成的内存,智能智能就是一种用来解决这种问题的方案(智能释放内存)。智能指针的思想是:智能指针是一种模板类,删除指针的时候回调用其析构函数来释放内存。使用智能指针需要头文件包含memory,再进行初始化。
例如:#include
auto_ptr ptr(new int); //一个指向int数据类型的指针
智能指针有auto_ptr , unique_ptr , shared_ptr

发布了15 篇原创文章 · 获赞 4 · 访问量 862

猜你喜欢

转载自blog.csdn.net/weixin_43319685/article/details/103144564
今日推荐