Python知识整理 (22) 类代码编写细节-1
class内包含类属性, 特殊名称方法重载运算符, __init__的构造函数. class内赋值变量名会创建类属性, 而内嵌的def则会创建类方法.位于class定义内的代码, 在class运行时, 会执行.
class MixedNames:
data = ‘spam’
def __init__(self, value):
self.data = value
def display(self):
print self.data, MixedNames.data # MixedNames.data类似于C++中的静态数据成员, 只是对于Python, 此data定义于类MixedNames中.
>>> x = MixedNames(1)
>>> y = MixedNames(2)
>>> x.display(); y.display()
输出:
1 spam
2 spam
class中定义的方法第一个参数总是接受方法调用的隐性主体, 也就是对象, Python会自动把实例方法的调用对应到类方法函数.
x.display()
#等价于
Mixednames.display(x)
调用超类的构造函数
class Super:
def __init__(self, x):
……
class Sub(Super):
def __init__(self,x,y):
Super.__init__(self, x)
<li>类接口技术</li>
<pre lang=’python’>
class Super:
def method(self):
print ‘in Super.method’
del delegate(self):
self.action()
class Inheritance(Super): # 继承
pass
class Replacer(Super): # 重定义
def mdethod(self):
print ‘in Replacer.method’
class Extender(Super): [...]
C++ 知识整理 (17) 数据语意学 Sematics of Data
对象的大小
对于A:
有一个隐含1byte, 使得该类的对象在内存分配时占用不同的内存地址(GCC为1, VS为0)
对于B,C:
语言本身的额外负担. 当有virtual base class时,派生类中有bptr, 指向virtual base class subpbject或者偏移表格
编译器对特殊情况所提供的优化处理
Alignment调整, alignment=4, 使BUS到最大吞吐效率
对于D:
两个bptr组成D
对于
class A{};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};
有
sizeof(A) == 1; sizeof(B) == 4; sizeof(C) == 4; sizeof(D) == 8;
注: static member/function, non-static function不加入类对象大小.
Data Member Layout数据成员布局
non-static data member不论访问限制, 仅按照出现的顺序, 由地址从低到高排列, 不一定连续, 是由于alignment的调整.
若有v.f. [...]
C++知识整理 (16) 构造函数语意学 Sematics of Constructor
Default Constructor的构造操作
当编译器需要, 非程序需要的时候, 会合成出一个constructor, 一般情况下, 若无用户自定义的构造函数, 则会implicit声明一个trivial default constructor.
带有Default Constructor的Member Class Object
若某class没有任何constructor, 但它内含一个member object, 而后者有default constructor, 那么前者的implicit default constructor是nontrivial
在C++的各编译模块(文件)中, 为防止在各个文件合成多个default constructor, 则合成为inline(静态内联展开), 如果无法合成为inline, 则合成为explicit static.
若用户自定义了default constructor, 但没有显示初始化类所含的类对象, 则编译器在D.C.前按照member object的声明顺序安插初始化代码.
若没有自定义D.C. 则生成nontrivial constructor, 用于安插代码.
带有Default Constructor的Base Class
继承类的基类带D.C., 而继承类没有D.C., 则会合成nontrivial D.C.
合成的D.C., 将隐式调用基类的D.C., 若自定义多个constructor, 而没有D.C., 则将扩展代码, 而不会合成新的D.C.
按照派生列表的顺序构造基类.
带有Virtual Function的Class
Class声明(或继承)了一个Virtual Function.
Class有一个或多个的virtual base class, 编译期间的两个扩展操作: (1) 创建一个vtbl (2) object中创建vptr. 编译器为object的vptr设定初值, 放置适当的vtbl地址
带有一个Virtual Base Class的Class
不同编译器之间差异很大, [...]

