大家好,我是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​​的小注意事项。当我们在一个窗口中编写了多个合约时,我们如何选择性地部署我们想要部署的那个呢?如下图

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

上述错误贴在这里:

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

这节内容就到这里啦~。