Solidity語言中關(guān)于構(gòu)造函數(shù)的定義:
- 構(gòu)造函數(shù)是使用
constructor
關(guān)鍵字聲明的一個可選函數(shù); - 構(gòu)造函數(shù)只在合約部署時調(diào)用一次,并用于初始化合約的狀態(tài)變量;
- 如果沒有顯式定義的構(gòu)造函數(shù),則由編譯器創(chuàng)建默認(rèn)構(gòu)造函數(shù)。
聲明語法
構(gòu)造函數(shù)聲明語法如下:
constructor(<paramslist>) <Access Modifier> {
// todo
}
其中:
- **
constructor
:**聲明構(gòu)造函數(shù)的關(guān)鍵字; - **
<paramslist>
:**構(gòu)造函數(shù)的參數(shù)列表,非必須; - **
<Access Modifier>
:**訪問修飾符(即函數(shù)可見性)。構(gòu)造函數(shù)的可見性可以是內(nèi)部的(internal)也可以是公共的(public),內(nèi)部構(gòu)造函數(shù)必須將合約標(biāo)記為抽象合約(在合約前添加abstract關(guān)鍵字)。抽象合約的參數(shù)不能被外部賦值,而僅能通過派生合約賦值。新的編譯器版本無需指定訪問修飾符。
例如,下面的合約聲明了一個構(gòu)造函數(shù),用于對狀態(tài)變量進(jìn)行初始化。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 構(gòu)造函數(shù)
contract Simple {
string str;
// 聲明構(gòu)造函數(shù),并初始化狀態(tài)變量
constructor() {
str = "hello simple";
}
// 定義一個函數(shù)返回狀態(tài)變量的值
function getValue() public view returns(string memory) {
return str;
}
}
繼承的構(gòu)造函數(shù)
如果父合約沒有定義構(gòu)造函數(shù),則調(diào)用默認(rèn)構(gòu)造函數(shù),如果在父合約中定義了構(gòu)造函數(shù),并且有一些參數(shù),則子合約需要提供所有參數(shù)。有兩種方法來調(diào)用父合約的構(gòu)造函數(shù):
直接初始化
**例子:**在下面的例子中,使用直接初始化方法來初始化父類的構(gòu)造函數(shù)。
/ SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 基類
contract Base {
uint data;
// 構(gòu)造函數(shù)
constructor(uint _data) {
data = _data;
}
}
// 繼承合約(直接初始化)
contract Derived is Base(2) {
// 構(gòu)造函數(shù)
// constructor() {}
// 定義一個函數(shù)訪問父合約的狀態(tài)變量
function getData() external view returns(uint) {
uint result = data ** 2;
return result;
}
}
// 調(diào)用合約
contract Caller {
// 創(chuàng)建子合約對象
Derived c = new Derived();
// 通過子合約對象訪問父合約和子合約的函數(shù)
function getResult() public view returns(uint) {
return c.getData();
}
}
輸出: 我們在Remix中編譯、部署和運行這個合約例子,執(zhí)行結(jié)果如下圖:
間接初始化
在下面的例子中,使用間接初始化方法來初始化父類的構(gòu)造函數(shù)。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 基類
contract Base {
string str;
// 構(gòu)造函數(shù)
constructor(string memory _str) {
str = _str;
}
}
// 繼承合約(間接初始化)
contract Derived is Base {
// 構(gòu)造函數(shù)
constructor(string memory _info) Base(_info) {}
// 定義一個函數(shù)訪問父合約的狀態(tài)變量
function getStr() external view returns(string memory) {
return str;
}
}
// 調(diào)用合約
contract Caller {
// 創(chuàng)建子合約對象
Derived c = new Derived("Hello Constructor");
// 通過子合約對象訪問父合約和子合約的函數(shù)
function getResult() public view returns(string memory) {
return c.getStr();
}
}
輸出: 我們在Remix中編譯、部署和運行這個合約例子。執(zhí)行結(jié)果如下圖:文章來源:http://www.zghlxwxcb.cn/news/detail-790811.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-790811.html
到了這里,關(guān)于以太坊智能合約開發(fā):Solidity語言中的構(gòu)造函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!