日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++grammar】代理构造、不可变对象、静态成员

發(fā)布時間:2023/12/1 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++grammar】代理构造、不可变对象、静态成员 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 1、Delegation Constructor(代理構造)
    • 1. What is delegating constructor? (什么是代理構造/委托構造)
    • 2. Avoiding recursive calls of target constructors (避免遞歸調(diào)用目標ctor)
    • 3. 委托構造的好處
  • 2、不可變對象和類
    • 1、如何讓類成為“不可變類”
    • 2、特殊情況:指針成員
    • 3、例子
    • 4、不可變對象的“不可變”特征在軟件開發(fā)中有什么用? 它和thread-safe有什么關系?
  • 3、不可變對象和類
    • 1、聲明或定義靜態(tài)成員
    • 2、靜態(tài)成員
    • 3、實例成員和靜態(tài)成員
    • 4、C 中static的作用

1、Delegation Constructor(代理構造)

1. What is delegating constructor? (什么是代理構造/委托構造)

代理構造:一個構造函數(shù)可以調(diào)用另外的構造函數(shù)
在代理構造的時候,被委托的要放在委托的構造函數(shù)的初始化列表的位置,不能放在在括號里面。

class A{ public: A(): A(0){}A(int i): A(i, 0){}A(int i, int j) {num1=i;num2=j;average=(num1+num2)/2;} private:int num1;int num2;int average; };

上面例子中,構造函數(shù)的調(diào)用次序:
A() ->A(int) ->A(int, int)
在這個過程中,形成了所謂的委托構造量,我們最怕的就是出現(xiàn)環(huán)形的委托構造。

2. Avoiding recursive calls of target constructors (避免遞歸調(diào)用目標ctor)

遞歸調(diào)用:函數(shù)調(diào)用其本身
遞歸調(diào)用實際上就是環(huán)形調(diào)用。

class A{ public: A(): A(0){}A(int i): A(i, 0){}A(int i, int j): A(){} private:int num1;int num2;int average; };

調(diào)用次序:
A() -> A(int) ->A(int, int) ->A()

3. 委托構造的好處

讓程序員少寫代碼,使邏輯更加清晰。
執(zhí)行程序時, 會先執(zhí)行 一個參數(shù)的構造函數(shù), 然后再執(zhí)行兩個參數(shù)的構造函數(shù)。
大大減少了代碼量。

2、不可變對象和類

不可變對象:對象創(chuàng)建后,其內(nèi)容不可改變,除非通過成員拷貝
不可變類:不可變對象所屬的類

1、如何讓類成為“不可變類”

1、所有數(shù)據(jù)域均設置為“私有”屬性
2、沒有更改器函數(shù)
3、也沒有能夠返回可變數(shù)據(jù)域對象的引用或指針的訪問器
如下:

2、特殊情況:指針成員

如果只有下面兩個條件,是構成不了不可變類的。
1、所有數(shù)據(jù)域均設置為“私有”屬性
2、沒有更改器函數(shù)
如果getter函數(shù)返回指向成員的指針,或者getter函數(shù)返回成員的引用。那么通過getter函數(shù)也能夠修改類成員。
如下:指針指向了類的私有成員,然后我們修改對象的私有數(shù)據(jù)成員,讓對象不成為不可變類。

所以才要加入第三個條件:沒有能夠返回可變數(shù)據(jù)域對象的引用或指針的訪問器

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()));}//帶參構造函數(shù)Employee(std::string name,Gender gender,Date birthday):name{name},gender{gender},birthday{birthday}{}//默認構造函數(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有什么關系?

將一些需要共享和協(xié)同開發(fā)的內(nèi)容設為不可變對象可以防止內(nèi)容被他人修改。起到類似const的作用。
詳細可以觀看這篇文章:
線程安全ThreadSafe

3、不可變對象和類

1、聲明或定義靜態(tài)成員

在類定義中,關鍵字 static 聲明 不綁定到類實例的成員( 該成員無需創(chuàng)建實例化對象即可訪問,可以直接用類去訪問)在類的內(nèi)部聲明
靜態(tài)成員的定義是很復雜的。
靜態(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 關鍵字
靜態(tài)數(shù)據(jù)成員的定義規(guī)則復雜,在類外定義,大部分情況下不會出錯

2、靜態(tài)成員

靜態(tài)數(shù)據(jù)成員具有靜態(tài)存儲期(static storage duration)或者C++11線程存儲期特性。
靜態(tài)存儲期
對象的存儲在程序開始時分配,而在程序結束時解回收。

(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)成員。

class Square { private:double side;static int numberOfObjects;// ... public://代理構造,無參構造函數(shù)調(diào)用有參構造函數(shù)Square():Square(1.0){}Square(double side){this->side = side;numberOfObjects++;}// ... }; //定義靜態(tài)數(shù)據(jù)成員,會被零初始化 int Square::numberOfObjects; int main() {Square s1{}, s2{5.0}; }

調(diào)用一次構造函數(shù),numberOfObjects就會+1,所以numberOfObjects可以統(tǒng)計成員數(shù)量

4、C 中static的作用

c語言中static關鍵字用法詳解

總結

以上是生活随笔為你收集整理的【C++grammar】代理构造、不可变对象、静态成员的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。