函数的重载

函数重载是指函数命名相同的函数,但需要满足以下两个条件之一

  1. 函数入参的数量不同
  2. 函数入参的类型不同

注意:address类型 与uint160 类型相同,若重载函数参数是两个类型则会报错

pragma solidity ^0.4.0;//函数的重载
//1 函数的名字相同  2函数的 参数(类型 数量)不同  3.返回的值类型不同不能被重载
//注意uint160 与address
contract chongzai{function fun(uint num) view public returns(uint){}function fun(uint8 num) view public returns(uint){}uint public a = 1;function test1(uint num){a=100;}function test1(uint8 num){a=200;}function test(){test1(288);}
}

函数入参

函数入参有两种方式

  1. 按照顺序依次向函数传入参数
  2. 将参数用对象的方式传入,不用按照顺序
pragma solidity ^0.4.0;
contract funcParam{uint public num;string public name;function setParam(uint _num,string _name) view public{num = _num;name = _name;}function test(){setParam(10,"waston");   }function test2(){setParam({_name:"万事通",_num:100});}
}

函数的返回值

  1. 函数返回值声明中可以定义变量
  2. 函数可以返回多个值
  3. 函数的返回值可以是形参
  4. 可以在函数返回值进行计算
pragma solidity ^0.4.0;
contract funReturn{function returnTest() view public returns(uint mul){uint a = 10;return a;}function returnTest2() view public returns(uint mul){mul=100;}function returnTest3() view public returns(uint mul){mul=100;uint a = 10;return a;}function returnTest4(uint a,uint b) view public returns(uint add,uint mul){add = a+b;mul=a*b;}function returnTest5(uint a,uint b) view public returns(uint add,uint mul){return (a+b,a*b);}function returnTest7(uint a,uint b) view public returns(uint add,uint mul){return (10,20);}function returnTest8(uint a,uint b) view public returns(uint a1,uint a2){return (b,a);}}

modifire

pragma solidity ^0.4.0;
contract modifireTest{address public owner;uint public num=0;//把合约的部署着地址存储再owner变量中constructor (){owner = msg.sender;}//定义modifire  modifier onlyOwner{//判断require(msg.sender==owner);_;  //动态添加} //附加上了modifire  先执行了 require(msg.sender==owner);  判断了我们合约的调用者是否等于合约的拥有者  如果成立则会执行下面的语句//否则就会回滚报错function changeIt(uint _num) onlyOwner{num = _num;}
}
pragma solidity ^0.4.0;
contract mappingTest{//账户IDmapping(address =>uint) idMapping;mapping(uint => string) nameMapping;uint public sum= 0;
//用户只能注册一次modifier control{require(idMapping[msg.sender]==0);_;}function register(string name)  control{//获取到当前合约的调用者address account = msg.sender;sum++;//将合约的调用者的地址与注册总量id联系在一起idMapping[account]=sum;//将用户id与用户注册的名字绑定在一起nameMapping[sum] =name;}//通过地址获取到idfunction getIdByAddress(address are) view public returns(uint){return idMapping[are];}//通过id获取到namefunction getNameById(uint id) view public returns(string){return nameMapping[id];}
}
pragma solidity ^0.4.0;
contract modifierTest2{uint public level = 9;string public name = "waston";uint public DNA;//函数的modifire 可以有参数modifier contrlLevel(uint needlevel){require(level>needlevel);_;}//使用modifire  增加代码的重用性 和扩展性function changeName()  contrlLevel(2){name="万事通";}function changeDna()  contrlLevel(10){DNA=999;}}

modifire 执行顺序

pragma solidity ^0.4.0;
//多重modifire
contract mulModifire{uint public a = 0;modifier mod1{a = 1;_;a=2;}modifier mod2{a=3;_;a=4;}//modifire 的执行顺序a=1   a=100 a=2 //函数中的替代了modifire中的_;function test1() mod1{a=100;}   //执行顺序  a=1 a=3 a=100 a=4 a=2function test() mod1 mod2{a=100;}
}

函数的继承

pragma solidity ^0.4.0;contract grandFather{uint public gudong=200;function zhongdi() public returns (string){return "zhongdi";}
}contract father is grandFather{uint public money =10000;function dahan() public returns(string){return "dahan"; }}
//合约能够被连续的继承
//son这个合约继承了father这个合约
contract son is father{function getMoney() returns (uint){//继承了父亲money这个属性return money; }//继承了父亲dahan 这个函数  行为function test(){dahan();}//继承了爷爷种地这个函数 行为  连续继承function test2(){zhongdi();}function getGudong() returns(uint){return gudong;}
}
pragma solidity ^0.4.0;
//1.如果属性不加上任何的修饰符 是可以被继承的
//2.加上了public属性后也是可以被继承的
//3 internal属性仍然是可以被继承的
//4 external编译报错 没有修饰符
//5 private 编译报错 因为private代表只有父类有这个属性不能被继承
// internal修饰的函数只能够在合约的内部或者继承的合约的内部使用  但是不能够在合约的外部使用
// external修饰的函函数不能够在内部调用   也不能在继承的合约内部调佣
contract father {uint money=10000;// uint public money=10000;// uint external money=10000;// uint private money = 10000;function dahan() external  returns (string){return "dahan";}//间接的在内部调用只能使用this指针function  dahanTest() public view {this.dahan();}
}
//external修饰的函数调用的第二种方式在另一个合约内创建或引用合约的“地址”来使用
contract externalTest{father f = new father();function externalTestIt() returns(string){return  f.dahan();}}
contract son is father{// function getMoney() public view returns (uint)// {//     return money;// }// function test() public view returns (string){//     return dahan();// }
}

函数小结

1 private不能够被继承 也不能在外部被调用  可以在内部被调用(所有的修饰符都这个)
2 internal 不能在外部被调用  可以被继承
3 external不能够在内部被调用 只能够在外部调用 可以被继承  如果强行调用  通过“地址。”
4 public 权限最大 可以在外部内部调用可以被继承
5 pure 不会读取全局变量 更不会修改全局变量  一个固定的输入  就会有一个固定的输出
6 constant 在函数中  和view相同 ,在全局变量中  致用户bytes1-bytes32 uint int string  代表数据不能被修改
7 view  只读取全局变量的值 不能修改他 不消耗gas
8 payable转账的时候必须要加的关键字
9 命名参数 {value:2,name:'wastoner'}
10 函数可以有多个返回值

solidity学习记录4 (函数的初步入门)相关推荐

  1. Solidity学习记录——第二章

    Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...

  2. Solidity学习记录——第四章

    Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...

  3. python大神的成长之路_Python大神成长之路: 第三次学习记录 集合 函数 装饰 re...

    学习记录day03 字符串可以直接切片,But字符串不可修改 字符串修改:生成了一个新的字符串 LIst修改,在原基础上修改(原内存上) 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重, ...

  4. 【学习记录】Python零基础入门(五)

    第五章 Python零基础入门之条件.循环及其他语句 本人自学的主要教材为Magnus Lie Hetland的Beginning Python:From Novice to Professional ...

  5. solidity 学习记录1

    开发工具 remix Remix - Ethereum IDE 需要下载的插件 solidity文档 Units and Globally Available Variables - Solidity ...

  6. JavaScript学习记录 (三) 函数和对象

    1.函数 使用 function 关键字来声明函数 函数的命名规则和变量一样 JS没有函数签名,所以没有函数重载 JS函数中的所有参数都是值传递:不能通过引用传递 // 定义函数 function t ...

  7. MySQL学习记录—Date函数系列

    文章目录 Date数据类型 MySQL中最重要的日期函数 MySQL日期格式化函数: date_format() MySQL日期减法函数 date_sub() MySQL日期加法函数 date_add ...

  8. 【学习记录】python matplotlib 自学入门(随缘更新)

    貌似基础 add_subplot 前两个参数表示把面板划分成怎样的形状(几行几列)第三个参数表示图在面板中的位置 import matplotlib.pyplot as plt fig =plt.fi ...

  9. Opencv 入门篇学习记录(图片)

    title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...

最新文章

  1. VMware14安装CentOS7的详细教程
  2. 基于小波变换到图像融合
  3. C语言二维数组的指针写法
  4. OpenCV文档阅读笔记-inRange官方解析及实例
  5. Linux中 print用法,linux之find中的-print0和xargs中-0用法
  6. javascript实现数据结构:广义表
  7. STL中的序列式容器——priority_queue(优先队列)
  8. 文件复制 详解(C++)
  9. 基于Linux系统开发在线词典
  10. 土壤类型空间分布数据介绍
  11. No code “EPSG:4326“ from authority “EPSG“
  12. 分享,请不要忽视了作者的版权
  13. 【原创干货】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单...
  14. 医学院交换去计算机学院,2017年北京协和医学院阜外心血管病医院823计算机原理考研强化模拟题...
  15. 五国启动税务执法联盟以解决加密货币网络犯罪威胁
  16. 搜狗Sogou拼音输入法,搜狗高速浏览器(IE浏览器内核)
  17. partial overwrite
  18. java 变量不初始化_Java之哪些情况下变量不会初始化
  19. 网络中存在的推广经验
  20. python字体描边_Android为TextView添加字体库和设置描边的方法

热门文章

  1. java 使用POI简单excel表格导出,通过浏览器直接下载
  2. 世界各国GDP国民生产总值1960-2021
  3. Qt/Qml获取1970年1月1日到现在的时间长度
  4. 我对CTO的理解【转】
  5. oracle 错误码
  6. cordova安装android平台,Android集成Cordova
  7. python里使用capwords()函数来把字符里每一个英语单词首字母变大写
  8. Bochs源码分析 - 14:bochs关于实地址模式下IVT表的管理
  9. Android核心服务解析篇(二)——Android源码结构分析
  10. 命令查询hdfs目录下文件总和