实战篇
注:以下代码来源于b站上面的基于以太坊的智能合约开发教程【Solidity】链接:https://www.bilibili.com/video/BV1St411a7Pk?p=34
重载
重载
1.函数名字相同
2.函数的参数不同(类型、数量)
3.不考虑函数的
pragma solidity >=0.4.15 <0.6.0;
contract chongzai
{
uint public a=0;
function fun(uint8 num)
{
a=100;
}
function fun(uint160 num)
{
a=200;
}
function test()
{
fun(256);
}
}
函数参数命名
pragma solidity >=0.4.22 <0.6.0;
contract param
{
uint public num;
string public name;
//传值
function setParam(uint _num,string _name)
{
num=_num;
name=_name;
}
//调用函数形式1:普通的传参方式
function Test()
{
setParam(10,"aaa00");
}
//调用函数形式2:“传参名:值”
function Test1()
{
setParam({_num:10,_name:"bbb00"});
}
}
点击test1,名字是bbb00,当点击test后,名字就变成了aaa00
返回值
pragma solidity >=0.4.12 <0.6.0;
contract returnTest{
//返回值可以没有名字
function returnTest1() returns(uint mul)
{
uint a=100;
return a;
}
//可以直接为返回值赋值,但是赋值的名字必须和返回值的名字相同
function returnTest2() returns(uint mul)
{
mul=200;
}
//为返回值赋值,尽管函数里面有跟返回值一样的名字,但是以return的为准
function returnTest3() returns(uint mul)
{
mul=200;
uint a=300;
return a;
}
//返回值可以是一个常量,它会自动匹配按序
function returnTest4() returns(uint mul)
{
mul=200;
return 4;
}
//函数可以有多返回值
function returnTest5() returns(uint mul,uint a)
{
mul=500;
uint b=300;
return (mul,b);
}
//返回值可以是多个常量,它会按序匹配
function returnTest6() returns(uint mul,uint a)
{
return (60,30);
}
}
变量的生命周期及作用域
pragma solidity >=0.4.12 <0.6.0;
contract valueCopy
{
uint public a=100;
uint b=200;
//因为这个函数中的a和public上的a不是一个地址,所以改的并不是public上的a.
function test() returns(uint)
{
uint a=5;
a=700;
return a;
}
//如果想要更改public上a的值
function changeIt()
{
a=700;
}
// function test1(uint a) returns(uint)
// {
// uint a=5;//如果传参的地方已经声明了,又在函数体中声明是不对的,任何地方都不能。
// a=700;
// return a;
// }
}
废弃的constant静态修饰
构造函数
构造函数可以有参数
新的版本使用constructor替换掉原来的构造函数命名方式
函数modifire
1.modifire:在函数前调用modifire内的命令,为true时才能执行函数。
2.判断此地址是否之前注册过,注册过就不能再注册了
3.modifire可以传参
4.多个modifire
继承
1.普通继承
2.多继承
3.public, internal, external,private区别
4.private不能被继承
internal权限
只能在函数内部调用或者继承合约内部使用,不能够在合约外部使用
external权限修饰详解
1.不能在合约内部调用,继承的合约内部也不能调用
2.在合约内部调用要用this.函数名()
3.一般是在另一个合约内调用
函数小结
全局变量自动getter函数
getter函数默认生成
mapping函数特殊
超级复杂的getter函数
套mapping
继承中函数的重载
当父合约和子合约属性和函数相同时,子合约会覆盖掉父合约的属性和函数
基因杂交–多重继承
1.可以继承多个父类
2.按照继承的对象顺序,后一个对象会覆盖前一个对象的相同属性或函数,例如:is father,mother,mother就会覆盖掉father.
3.如果儿子有和父类相同的属性,就会覆盖父类的属性
合约的销毁
用selfdestruct(合约部署者地址);进行销毁