【C++grammar】代理构造、不可变对象、静态成员
目錄
- 1、Delegation Constructor(代理構(gòu)造)
- 1. What is delegating constructor? (什么是代理構(gòu)造/委托構(gòu)造)
- 2. Avoiding recursive calls of target constructors (避免遞歸調(diào)用目標ctor)
- 3. 委托構(gòu)造的好處
- 2、不可變對象和類
- 1、如何讓類成為“不可變類”
- 2、特殊情況:指針成員
- 3、例子
- 4、不可變對象的“不可變”特征在軟件開發(fā)中有什么用? 它和thread-safe有什么關(guān)系?
- 3、不可變對象和類
- 1、聲明或定義靜態(tài)成員
- 2、靜態(tài)成員
- 3、實例成員和靜態(tài)成員
- 4、C 中static的作用
1、Delegation Constructor(代理構(gòu)造)
1. What is delegating constructor? (什么是代理構(gòu)造/委托構(gòu)造)
代理構(gòu)造:一個構(gòu)造函數(shù)可以調(diào)用另外的構(gòu)造函數(shù)
在代理構(gòu)造的時候,被委托的要放在委托的構(gòu)造函數(shù)的初始化列表的位置,不能放在在括號里面。
上面例子中,構(gòu)造函數(shù)的調(diào)用次序:
A() ->A(int) ->A(int, int)
在這個過程中,形成了所謂的委托構(gòu)造量,我們最怕的就是出現(xiàn)環(huán)形的委托構(gòu)造。
2. Avoiding recursive calls of target constructors (避免遞歸調(diào)用目標ctor)
遞歸調(diào)用:函數(shù)調(diào)用其本身
遞歸調(diào)用實際上就是環(huán)形調(diào)用。
調(diào)用次序:
A() -> A(int) ->A(int, int) ->A()
3. 委托構(gòu)造的好處
讓程序員少寫代碼,使邏輯更加清晰。
執(zhí)行程序時, 會先執(zhí)行 一個參數(shù)的構(gòu)造函數(shù), 然后再執(zhí)行兩個參數(shù)的構(gòu)造函數(shù)。
大大減少了代碼量。
2、不可變對象和類
不可變對象:對象創(chuàng)建后,其內(nèi)容不可改變,除非通過成員拷貝
不可變類:不可變對象所屬的類
1、如何讓類成為“不可變類”
1、所有數(shù)據(jù)域均設(shè)置為“私有”屬性
2、沒有更改器函數(shù)
3、也沒有能夠返回可變數(shù)據(jù)域?qū)ο蟮囊没蛑羔樀脑L問器
如下:
2、特殊情況:指針成員
如果只有下面兩個條件,是構(gòu)成不了不可變類的。
1、所有數(shù)據(jù)域均設(shè)置為“私有”屬性
2、沒有更改器函數(shù)
如果getter函數(shù)返回指向成員的指針,或者getter函數(shù)返回成員的引用。那么通過getter函數(shù)也能夠修改類成員。
如下:指針指向了類的私有成員,然后我們修改對象的私有數(shù)據(jù)成員,讓對象不成為不可變類。
所以才要加入第三個條件:沒有能夠返回可變數(shù)據(jù)域?qū)ο蟮囊没蛑羔樀脑L問器
3、例子
#include<iostream> #include<string> using namespace std;class Date { private:int year = 2019, month = 1, day = 1; public:int getYear() { return year; }int getMonth() { return month; }int getDay() { return day; }void setYear(int y) { year = y; }void setMonth(int m) { month = m; }void setDay(int d) { day = d; }Date() = default;Date(int y, int m, int d) :year(y), month(m), day(d) {}std::string toString() {return (std::to_string(year) + '-' + std::to_string(month) + '-' + std::to_string(day));} };enum class Gender {male,female, };class Employee { private:std::string name;Gender gender;Date birthday; public:void setName(std::string name) { this->name = name; }void setGender(Gender gender) { this->gender = gender; }void setBirthday(Date birthday) { this->birthday = birthday; }std::string getName() { return name; }Gender getGender() { return gender; }Date* getBirthday() { return &birthday; }std::string toString(){return (name +( (gender == Gender::male ? std::string(" male ") : std::string(" female ") )+ birthday.toString()));}//帶參構(gòu)造函數(shù)Employee(std::string name,Gender gender,Date birthday):name{name},gender{gender},birthday{birthday}{}//默認構(gòu)造函數(shù)Employee():Employee("Alan",Gender::male,Date(2000,4,1)){} };//創(chuàng)建Employee對象,然后修改其生日 int main() {Employee e;//1:settere.setBirthday(Date(1999,1,1));std::cout << e.toString() << std::endl;//2:gettere.getBirthday()->setYear(1998);std::cout << e.toString() << std::endl;return 0; }4、不可變對象的“不可變”特征在軟件開發(fā)中有什么用? 它和thread-safe有什么關(guān)系?
將一些需要共享和協(xié)同開發(fā)的內(nèi)容設(shè)為不可變對象可以防止內(nèi)容被他人修改。起到類似const的作用。
詳細可以觀看這篇文章:
線程安全ThreadSafe
3、不可變對象和類
1、聲明或定義靜態(tài)成員
在類定義中,關(guān)鍵字 static 聲明 不綁定到類實例的成員( 該成員無需創(chuàng)建實例化對象即可訪問,可以直接用類去訪問)在類的內(nèi)部聲明
靜態(tài)成員的定義是很復(fù)雜的。
靜態(tài)數(shù)據(jù)成員定義的規(guī)則:
(1) 聲明為“constexpr”類型的靜態(tài)數(shù)據(jù)成員必須 在類中聲明 并初始化。自C++17 起,可不在類外定義
(2) 聲明為==“inline”(C++17 起) 或者 “const int” == 類型的靜態(tài)數(shù)據(jù)成員可以 在類中聲明 并初始化;
(3) 其它須在類外 定義并初始化,且不帶static 關(guān)鍵字
靜態(tài)數(shù)據(jù)成員的定義規(guī)則復(fù)雜,在類外定義,大部分情況下不會出錯
2、靜態(tài)成員
靜態(tài)數(shù)據(jù)成員具有靜態(tài)存儲期(static storage duration)或者C++11線程存儲期特性。
靜態(tài)存儲期
對象的存儲在程序開始時分配,而在程序結(jié)束時解回收。
(1) Only one instance of the object exists ( 只存在對象的一個實例)
(2) 靜態(tài)存儲器對象未明確初始化時會被自動“零初始化(Zero-Initialization)”
3、實例成員和靜態(tài)成員
一旦實例化了Square(創(chuàng)建了Square的對象),每個對象中都有各自的side成員。這個side成員就叫做實例成員。
而numberOfObjects只存在一個,是由所有的Square對象共享的,叫做靜態(tài)成員。
調(diào)用一次構(gòu)造函數(shù),numberOfObjects就會+1,所以numberOfObjects可以統(tǒng)計成員數(shù)量
4、C 中static的作用
c語言中static關(guān)鍵字用法詳解
總結(jié)
以上是生活随笔為你收集整理的【C++grammar】代理构造、不可变对象、静态成员的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 93. 复原IP地址
- 下一篇: leetcode 202. 快乐数 思考