属性的访问权限
属性:状态变量
属性的权限有三种:public internal private
pragma solidity ^0.4.4;
/*
属性的权限有三种:public internal private
*/
contract Person {
uint _age;//默认的是internal
uint internal _weight;
uint private _money;
uint public _sex;
}
效果如下:
说明:属性默认类型为“internal”,“internal”和“private”类型的属性都不能被外部访问,当属性的类型为“public”类型时,会默认自动生成一个和属性名相同并且返回值就是当前属性的get函数。
function _sex() constant returns (uint) {
return 1;
}
自己写的get函数会覆盖掉public类型的属性自动生成的get函数,_sex值变为1,而不是0。
方法/行为访问权限:合约里的函数
方法的权限有三种:public internal private
pragma solidity ^0.4.4;
contract Person {
function age() constant returns (uint) {
return 18;
}
function sex() constant public returns (uint) {
return 1;
}
function weight() constant private returns (uint) {
return 120;
}
function height() constant internal returns (uint) {
return 170;
}
}
效果如下:
说明:函数的权限默认为“public”,“internal”和“private”类型的属性都不能被外部访问。
属性和方法
pragma solidity ^0.4.4;
contract Person {
uint _age;//默认的是internal
uint internal _weight;
uint private _money;
uint public _sex;
function test1() constant returns (uint) {
this._sex; //public的属性可以指针调用
return _age;
}
function test2() constant public returns (uint) {
return _weight;
}
function test3() constant internal returns (uint) {
return _money;
}
function test4() constant private returns (uint) {
return _sex;
}
function testPublic() constant returns (uint) {
return this.test1(); //指针访问
}
function testInternal() constant returns (uint) {
return test3(); //直接访问
}
function testPrivate() constant returns (uint) {
return test4(); //直接访问
}
}
效果如下:
说明:属性默认的权限为internal,只有public类型的属性才可以供外部访问,internal和private类型的属性只能在合约内部使用。
函数的默认权限是public类型,public类型的函数可供外部访问,而internal和private类型的函数不能通过指针(this)进行访问,哪怕是在内部通过调用this访问都会报错,在合约内部访问,我们可以直接访问函数就可以了。
备注:不论是属性还是方法,只有是public类型时,才可以通过合约地址进行访问。合约内部的this就是当前合约的地址,在合约内部要访问internal和private类型的属性和方法时,直接访问即可。