大家好,我是up通,通学技术,学通技术,欢迎大家继续跟我一起学习智能合约系列。
external和internal
除 public 和 private 属性之外,Solidity 还使用了另外两个描述函数可见性的修饰词:internal(内部) 和 external(外部)。internal 和 private 类似,不过, 如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。(有点类似于java 中的protect)
external 与public 类似,只不过这些函数只能在合约之外调用 - 它们不能被合约内的其他函数调用。
这小节,我们主要看一下,基本数据类型的值传递。
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
的基本类型所定义的引用是具有彼此独立的内存空间的。理解这一点即可。
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){
^------^
总结一下:
0.5
以前版本中,修饰函数时,等价于view,在0.5
以后的版本中,已经删除该用法。我们都知道,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.
这节内容就到这里啦~。