solidity函数相关总结
function (<parameter types>) {private|internal|external|public} [pure|constant|view|payable] [returns(<return types>)] 1. 函数重载
1. 函数重载是指函数命名相同,但需要满⾜以下两个条件:
1. 函数传⼊参数的数量不同
2. 函数传⼊参数的类型不同
2. 若函数与多个参数均可以匹配,则会报错。例如 uint8 和 uint 均匹配时,报错
3. 返回值的不同⽆效,其不能作为重载的依据
4. address与uint160实际存储⼀致,故也会报错
pragma solidity ^0.4.17;
contract Overload{
//error,重名⽅法
function fun1(){}
function fun1(){}
//error,返回值不能作为判断依据
function fun2() returns(string){}
function fun2() returns(uint){}
//参数数量的不同可以作为重载的依据
function fun3(uint _num) {}
function fun3() {}
//编译通过,参数类型不同可以作为重载的依据,但是传参<256时会报错,⽆法匹配⽅法
function fun4(uint _num) {}
function fun4(uint8 _num) {}
/
/编译通过,但两者存储⽅式⼀致,故⽆法匹配。但⾃⼰实际的版本时候可⾏需要进⼀步验证。
function fun5(uint160 account) {}
牛津字典在线翻译function fun5(address account) {}
}
2. 函数传⼊参数
1. 可以使⽤类json的格式传⼊参数,顺序可以调整
2. 在⽅法中调⽤其他⽅法时,必须传⼊所有参数,否则报错。但在外部调⽤多参数⽅法时,可以不必指定全部参数
uint public num;
string public name;
//在外部调⽤该多参数⽅法时,参数可以不全部指定
function tParam(uint _num,string _name) public{
num = _num;
name = _name;lenka的歌
}
//普通调⽤
function test1() public{
tParam(10,"yorick");
}surpri的用法
//使⽤类json的形式调⽤
function test2() public{
tParam({_name:"tom",_num:20});
}
/
/error,在⽅法中必须指定全部参数
function test3() public{
tParam(10);
}
qiang}
3. 函数参数返回
1. solidity⽀持多参数返回,采⽤元组的形式
2. returns中不是仅可以加类型,也可以添加变量。可以为该变量直接赋值。也可以通过return赋值。若两种⽅式都使⽤时,以
return为标准。
//returns后可以写变量名
function test1() pure public returns(uint a){
uint num = 10;
return num;
}
//可以为returns后⾯的变量直接赋值
function test2() pure public returns(uint a){
a = 20;
}
//两种赋值⽅式均存在的时候,以return为标准
function test3() pure public returns(uint a){
uint num = 10;
a = 20;
return num;
}
//多参数返回
function test4() pure public returns(uint a,uint b){
a = 10;
b = 20;
relax的过去式}
//多参数return返回
egg是什么意思
function test5() pure public returns(uint a,uint b){
return (10,20);
}
ratatouillefunction test6(uint num1,uint num2) pure public returns(uint add,uint mul){ add = num1 + num2;
mul = num1 * num2;
suffers}
function test7(uint num1,uint num2) pure public returns(uint add,uint mul){ return (num1+num2,num1*num2);
}
}
4. 变量作⽤域
uint public num = 100;
//不能重定义
//uint num = 200;
//⽅法内部的重名变量覆盖了合约变量
function test1() pure public returns(uint) {
uint num = 10;
num = 11;
return num;
}
//传⼊的参数也属于⽅法内部的变量,故也覆盖了合约的重名变量
function test2(uint num) pure public returns(uint){
//以下均重定义 error
//uint num = 13;
//for(uint num=0 ; num<10 ; num++){}
{
/
/uint num = 10;
}
num = 12;
return num;
}
}
5. 值传递
pragma solidity ^0.4.17;
contract ValueTransfer{
uint public num1 = 100;
//仅是拷贝num1中的值
uint public num2 = num1;
//由于是值的传递,修改num2的值不会改变num1的值
function changeNum() public{
num2 = 999;
}
//参数传递拷贝的是副本,副本的修改与原数据⽆关
function changeNum(uint _num2) pure public returns(uint){
_num2++;
return _num2;
}
function test() view public returns(uint){
return changeNum(num2);
}
}
6. constant关键字
1. constant可以在函数声明的时候使⽤,相当于view,不消化gas。但是5.0以后废弃
2. constant只能⽤于全局变量
3. constant声明的值不可以修改
ft是什么意思4. constant可以⽤于uint,int,bytes,string类型的变量
7. 构造函数
1. 构造函数会在合约部署时⾃动调⽤⼀次
2. 可以有很多⽤途,⽐如:初始化合约时候指定合约的拥有者
contract FuncConstructor{
uint public a;
uint public b;
//构造函数初始化合约变量的值
constructor(uint _a,uint _b) public{
a = _a;
b = _b;
}
}
//同⼀个⽂件可以写多个合约,部署时候选择对应合约即可
contract FuncConstructor2{
address public owner;
//使⽤构造函数指定合约的拥有者地址
constructor() public{
owner = msg.nder;
}
}
8. modifier函数
1. 调⽤modifier函数后会将调⽤⽅法的代码插⼊到 _; 位置运⾏,并且在其前后插⼊modifier函数已经写好的代码
2. 可以实现判断,赋值等操作
pragma solidity ^0.4.17;
contract ModifierTest{
address public owner;
uint public num;
constructor() public{
owner = msg.nder;
}
modifier OnlyOwner{
//判断地址是否为合约拥有者的地址
require(msg.nder == owner);
//将调⽤⽅法的代码动态插⼊
_;
}
/
/使⽤modifier函数,仅需在后⾯添加该函数即可
function changeNum() OnlyOwner public {
num = 100;
}
}
//功能:实现仅当没有注册该地址的时候才会执⾏注册操作
//利⽤modifier做注册⽤户的判断操作
quarrelcontract ModifierTest2{
mapping(address => uint) addressMapping;
mapping(uint => string) idMapping;
uint public count;
/
/在注册前先判断是否已经将该地址注册进合约中
modifier controlAddr{
require(addressMapping[msg.nder] == 0);
_;
}
//添加modifier函数的修饰
function register(string name) controlAddr public{
addressMapping[msg.nder] = ++count;