1、solidity中的变量定义
在solidity中,变量声明后都会默认赋值为初始值。
- 对于引用类型,声明后还需要显示分配内存。
- 对于映射类型,不显示初始化也可以使用,不过里面没有任何值。
- 枚举如果没有初始化,默认取顺位第一个值;
- 结构体没有初始化,里面所有变量是初始值。
非常关键的一点:变量无论在函数什么位置定义,作用域都是这个函数。
2、solidity中的delete操作符
solidity中因为区块是一种公共资源,为了避免滥用,可以用delete操作符释放空间,可能还会返回一些gas。
2.1 删除基本类型,会将基本类型设置为初始值,
- bool 初始值是false
- uint是0
- address和变长数组是0x0
- string是空串
- 枚举将会被置为序号为0的值
- 函数类型不能删除
- 结构体,删除后结构体中的类型会恢复为初始值,如果结构体中有映射,会直接跳过
- 映射,直接删除会报错,但是可以指定删除某一项
- 定长数组,直接删除会将数组内所有元素置为初始值。如果指定删除数组的某一个元素,只会把当前元素置为初始值,其余不变
2.2 删除注意事项
由于本身并未提供对映射这样的大对象的清理,所以存储并遍历它们来进行清理,显得特别消耗gas
。一种实践就是能复用就复用,一般不主动清理。
删除本质是对一个变量赋初值。所以我们删除storage
的引用时会报错,因为storage
的引用并没有自己已分配的存储空间,所以不能对storage的引用直接赋初值。
3、合约中的继承
继承的关键字是is,继承也支持传参。继承中,不允许出现相同的函数名,事件名,修改器名,或者互相重名。子类允许重写函数,但是不允许重写返回函数签名。
由于继承的实现方案是代码拷贝,所以合约继承后,部署到网络时,将变成一个合约。代码将从父类拷贝到子类中。
在继承链中,如果出现函数重名,最终使用的是继承链上最远继承的那个。
pragma solidity ^0.4.0;
contract Base1{
function data() returns(uint){
return 1;
}
}
contract Base2{
function data() returns(uint){
return 2;
}
}
contract MostDerived1 is Base1, Base2{
function call() returns(uint){
return data();
}
}
contract MostDerived2 is Base2, Base1{
function call() returns(uint){
return data();
}
}
例子中,MostDerived1将会返回2,MostDerived2将会返回1.
在solidity中,可以显示指定调用父合约的方法。
super关键字?
在Solidity中,允许多继承,你可以同时继承多个合约。实现多继承的编程语言需要解决几个问题,其中之一是菱形继承问题
又称钻石问题。
此外,继承由于遵循最远继承原则,所以继承的顺序也很关键。