【C++grammar】代理構造、不可變對象、靜態成員

目錄

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

1、Delegation Constructor(代理構造)

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

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

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;
};

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

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

遞歸調用:函數調用其本身
遞歸調用實際上就是環形調用。

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;
};

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

3. 委托構造的好處

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

2、不可變對象和類

不可變對象:對象創建后,其內容不可改變,除非通過成員拷貝
不可變類:不可變對象所屬的類

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

1、所有數據域均設置為“私有”屬性
2、沒有更改器函數
3、也沒有能夠返回可變數據域對象的引用或指針的訪問器
如下:
在這里插入圖片描述

2、特殊情況:指針成員

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

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

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()));}//帶參構造函數Employee(std::string name,Gender gender,Date birthday):name{name},gender{gender},birthday{birthday}{}//默認構造函數Employee():Employee("Alan",Gender::male,Date(2000,4,1)){}
};//創建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、不可變對象的“不可變”特征在軟件開發中有什么用? 它和thread-safe有什么關系?

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

3、不可變對象和類

1、聲明或定義靜態成員

在類定義中,關鍵字 static 聲明 不綁定到類實例的成員( 該成員無需創建實例化對象即可訪問,可以直接用類去訪問)在類的內部聲明
靜態成員的定義是很復雜的。
靜態數據成員定義的規則:

(1) 聲明為“constexpr”類型的靜態數據成員必須 在類中聲明 并初始化。自C++17 起,可不在類外定義
(2) 聲明為==“inline”(C++17 起) 或者 “const int” == 類型的靜態數據成員可以 在類中聲明 并初始化;
(3) 其它須在類外 定義并初始化,且不帶static 關鍵字
靜態數據成員的定義規則復雜,在類外定義,大部分情況下不會出錯

2、靜態成員

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

(1) Only one instance of the object exists ( 只存在對象的一個實例)
(2) 靜態存儲器對象未明確初始化時會被自動“零初始化(Zero-Initialization)”

3、實例成員和靜態成員

一旦實例化了Square(創建了Square的對象),每個對象中都有各自的side成員。這個side成員就叫做實例成員。
而numberOfObjects只存在一個,是由所有的Square對象共享的,叫做靜態成員。

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

調用一次構造函數,numberOfObjects就會+1,所以numberOfObjects可以統計成員數量
在這里插入圖片描述

4、C 中static的作用

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

paip.最新的c++ qt5.1.1環境搭建跟hello world

paip.最新的c qt5.1.1環境搭建跟hello world 作者Attilax &#xff0c; EMAIL:1466519819qq.com 來源&#xff1a;attilax的專欄 地址&#xff1a;http://blog.csdn.net/attilax 有一段時間沒接觸c了...今天下載新的qt下來研究一番.. qt的環境搭建有eclipseqtdtmingwqtl…

RFID模塊+WIFI模塊+振動傳感器+有源蜂鳴器+舵機+Arduino UNO R3所構成的門禁系統模塊

該系統模塊主要由RFID模塊WIFI模塊振動傳感器有源蜂鳴器舵機Arduino UNO R3組成的門禁系統模塊。這里使用舵機充當門鎖&#xff0c;用戶可以刷卡開門&#xff0c;也可以通過APP控制舵機狀態達到開門的效果。若有不法分子想要強行進入室內&#xff0c;對門進行撞擊或者人為的破壞…

PushManager

http://suchandalex.googlecode.com/svn/trunk/beOui/beWe/client/Classes/PushNotificationManager.m轉載于:https://www.cnblogs.com/vincent-lu/archive/2012/01/18/2325740.html

krsort_PHP krsort()函數與示例

krsortPHP krsort()函數 (PHP krsort() function) krsort() function is used to sort an associative array in descending order based on the keys, as we know that an associative array contains keys and values, this method sorts an array according to the keys. kr…

ESP12E Shield+Arduino UNO R3開發板+DHT11溫濕度模塊+雙色LED燈+有源蜂鳴器+光敏電阻模塊+I2CLCD1602液晶顯示器所構成的室內檢測系統

室內檢測系統由ESP12E ShieldArduino UNO R3開發板DHT11溫濕度模塊雙色LED燈有源蜂鳴器光敏電阻模塊I2CLCD1602液晶顯示器所構成。DHT11溫濕度模塊獲取室內溫濕度數據通過I2CLCD1602液晶顯示器進行顯示&#xff0c;另一方面通過ESP12E Shield將數據上傳至云平臺。光敏電阻進行捕…

輸入輸出函數:

一、printf函數&#xff1a;     printf("Hello World!\n");     printf("My age is %d\n",26);     int age 17;     printf("My age is %d\n",age);  %d 或 %i: 帶符號 十進制整數。   %o:不帶符號 八進制整數。   %x:…

leetcode 202. 快樂數 思考分析(哈希集合與雙指針解)

1、題目 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」定義為&#xff1a;對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和&#xff0c;然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變不到 1。如果 可以變為 1&am…

五、線性回歸和多項式回歸實現

官網API 一、線性回歸 針對的是損失函數loss faction Ⅰ、Lasso Regression 采用L1正則&#xff0c;會使得w值整體偏小&#xff1b;w會變小從而達到降維的目的 import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegresso…

JavaScript中的地圖與對象

JavaScript對象與地圖 (JavaScript Objects vs Maps) Objects are super popular in JavaScript so its not a term you are hearing for the first time even if youre a novice JS developer. Objects, in general, are a very common data structure that is used very ofte…

深發展銀行編碼器(解剖)

電池拆下來&#xff0c;再裝上&#xff0c;還能繼續用下&#xff0c;不會被重置 轉載于:https://www.cnblogs.com/ahuo/archive/2012/01/25/2329485.html

關于$.getJson

這是一個Ajax函數的縮寫&#xff0c;這相當于: 123456$.ajax({dataType: "json",url: url,data: data,success: success});數據會被附加到一個查詢字符串的URL中&#xff0c;發送到服務器。如果該值的data參數是一個普通的對象&#xff0c;它會轉換為一個字符串并使用…

leetcode 1. 兩數之和 思考分析

1、題目 給定一個整數數組 nums 和一個目標值 target&#xff0c;請你在該數組中找出和為目標值的那 兩個 整數&#xff0c;并返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素不能使用兩遍。 2、思考分析 雙for循環的時間復雜度…

六、邏輯回歸

一、何為邏輯回歸 邏輯回歸可以簡單理解為是基于多元線性回歸的一種縮放。 多元線性回歸y的取值范圍在(-∞&#xff0c;∞)&#xff0c;數據集中的x是準確的一個數值。 用這樣的一個數據集代入線性回歸算法當中會得到一個模型。 這個模型所具備的功能就是當有人給這個模型一個…

C# 調用Windows API實現兩個進程間的通信

使用Windows API實現兩個進程間&#xff08;含窗體&#xff09;的通信http://blog.csdn.net/huangxinfeng/article/details/5513608 從C#下使用WM_COPYDATA傳輸數據說到Marshal的應用http://www.cnblogs.com/jiangyh-is-me/archive/2006/06/05/417381.html 問題解決&#xff1a…

如何在Golang中返回錯誤?

In Golang, we return errors explicitly using the return statement. This contrasts with the exceptions used in languages like java, python. The approach in Golang to makes it easy to see which function returns an error? 在Golang中&#xff0c;我們使用return…

leetcode 383. 贖金信 思考分析

題目 給定一個贖金信 (ransom) 字符串和一個雜志(magazine)字符串&#xff0c;判斷第一個字符串 ransom 能不能由第二個字符串 magazines 里面的字符構成。如果可以構成&#xff0c;返回 true &#xff1b;否則返回 false。 (題目說明&#xff1a;為了不暴露贖金信字跡&#x…

Numpy(科學計算庫)---講解

本內容來自《跟著迪哥學Python數據分析與機器學習實戰》&#xff0c;該篇博客將其內容進行了整理&#xff0c;加上了自己的理解&#xff0c;所做小筆記。若有侵權&#xff0c;聯系立刪。 迪哥說以下的許多函數方法都不用死記硬背&#xff0c;多查API多看文檔&#xff0c;確實&a…

仿安居客好租網房產源碼

網站設計簡約&#xff0c;大方&#xff0c;清爽開發技術&#xff1a;ASP.NET3.5,SQL2005,VS2008功能簡介1、小區&#xff0c;二手房&#xff0c;租房小區發布&#xff0c;編輯&#xff0c;修改功能&#xff0c;圖片批量上傳2、支持積分&#xff0c;發布房源、發布論壇帖子可獲得…

Eclipse中classpath和deploy assembly的文件位置

classpath的配置信息存儲在工程根目錄下的.classpath文件 deploy assembly配置信息存儲在工程目錄下的.settings\org.eclipse.wst.common.component文件中轉載于:https://www.cnblogs.com/jubincn/p/3381087.html

LeetCode 454. 四數相加 II 思考分析

題目 給定四個包含整數的數組列表 A , B , C , D ,計算有多少個元組 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 為了使問題簡單化&#xff0c;所有的 A, B, C, D 具有相同的長度 N&#xff0c;且 0 ≤ N ≤ 500 。所有整數的范圍在 -228 到 228 - 1 之間&am…