通学智能合约系列(十四)--函数2

Posted 通学技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通学智能合约系列(十四)--函数2相关的知识,希望对你有一定的参考价值。

大家好,我是up通,通学技术,学通技术,欢迎大家继续跟我一起学习智能合约系列。

5.external权限修饰符详解

external和internal
除 public 和 private 属性之外,Solidity 还使用了另外两个描述函数可见性的修饰词:internal(内部) 和 external(外部)。

internal 和 private 类似,不过, 如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。(有点类似于java 中的protect)
external 与public 类似,只不过这些函数只能在合约之外调用 - 它们不能被合约内的其他函数调用。

6.值传递与副本拷贝

这小节,我们主要看一下,基本数据类型的值传递。

pragma solidity ^0.4.16;

contract transferValueTest{
    
    uint public a = 100;
    uint public b = a;
    
    function changIt(){
        b = 999;
    }
    
    function changeIt2() view returns(uint,uint){
        
        uint a1= 100;
        uint b1 = a1;
        // b1 = 999;
        return(a1,b1);
    }
    // i作为形式参数 当调用该函数时,是将所传值的副本传入的,并不会改变所传引用的值
    function changeIt3(uint i) returns(uint){
        i++;
        return i++;
    }
    
    function test(){
        changeIt3(a);
    }
  
}

如果小伙伴有学习过其他编程语言,我们会很容易理解,两个基本类型的值,彼此拥有独立的内存空间,对b重新赋值是不会影响a值的变化的~!

这节内容的重点,主要是在阐述,我们solidity的基本类型所定义的引用是具有彼此独立的内存空间的。理解这一点即可。

7.废弃的const静态修饰(建议直接跳过)

pragma solidity ^0.4.16;

contract constantTest{
    // 在0.4版本中,等同于view  在0.5以上版本中,已经废弃。
    function test() constant returns(uint){
        return 100;
    }
}

当你选择0.5以上版本时,当你使用constant关键字时,编译则会报错如下:

browser/Math.sol:5:21: ParserError: The state mutability modifier "constant" was removed in version 0.5.0. Use "view" or "pure" instead.
    function test() constant returns(uint){
                    ^------^

总结一下:

  • constant在0.5以前版本中,修饰函数时,等价于view,在0.5以后的版本中,已经删除该用法。
  • constant可以作为全局变量,不能用于用作局部变量
  • constant作为全局变量修饰成员变量时,该变量不可更改
  • 当前版本支持uint,string,bytes1—bytes32,address等,使用constant关键字。

8.快人一步的构造函数

我们都知道,java的构造函数是在new对象的时候调用的,那么智能合约的构造函数是在什么时候调用的呢?

下面我们来看一个例子:

pragma solidity ^0.4.16;

contract constructorTest{
     // 初始化结果为0
     uint public a;
     // 在合约部署的时候执行
     function constructorTest(){
         a = 100;
     }
     
     // 一个合约内部 不能有多个构造函数
     //function constructorTest(uint _a,uint _b){
     //    a = _a;
     //}
     
}

既然,我们知道一个合约有且仅有一个构造函数,那么我们是不是可以利用构造函数做点什么呢?别急,我们再来看看下面的代码。

pragma solidity ^0.5.17;

contract constructorTest2{
    
     uint public a;
     
     constructor() public{
         a = 100;
     }
}

是的,在0.5以上版本,solidity采用了类似于我们其他高级语言如java等通用的关键字constructor来定义构造函数。既然,我们知道了构造函数是在部署的时候执行的。那么在部署时,我们便可以传递一些内容到合约内,例如我们的调用者,代码如下;

pragma solidity ^0.4.16;

contract constructorTest1{
    
     address public ower;
     
     function constructorTest1(){
         ower = msg.sender;
     }
}

在实际的开发中,构造函数会帮助我们初始化一些有用的东西,这节就先介绍到这里。

另外在这里介绍一个Remix的小注意事项。当我们在一个窗口中编写了多个合约时,我们如何选择性地部署我们想要部署的那个呢?如下图

在这里插入图片描述
上述错误贴在这里:

call to constructorTest2.a errored: VM error: invalid opcode.
invalid opcode	
	The execution might have thrown.
	Debug the transaction to get more information. 

这节内容就到这里啦~。

以上是关于通学智能合约系列(十四)--函数2的主要内容,如果未能解决你的问题,请参考以下文章

通学智能合约系列(十四)--函数修改器modifier

通学智能合约系列(十三)--函数1

通学智能合约系列(十三)--函数1

通学智能合约系列(十八)--函数的重写与自我销毁

通学智能合约系列(十七)--函数的重写与自我销毁

通学智能合约系列(十七)--函数与Getter