1. 程式人生 > >建構函式定義為private,protected(轉)

建構函式定義為private,protected(轉)

將建構函式,解構函式宣告為私有和保護的,那麼物件如何建立?
已經不能從外部呼叫構造函數了,但是物件必須被構造,應該如何解決,麻煩大家幫忙說明,關於構造,解構函式宣告為私有和保護時的用法??? 
提出這個問題,說明你已經對c++有所思考了。

從語法上來講,一個函式被宣告為protected或者private,那麼這個函式就不能從“外部”直接被呼叫了。
對於protected的函式,子類的“內部”的其他函式可以呼叫之。
而對於private的函式,只能被本類“內部”的其他函式說呼叫。

語法上就是這麼規定的,你肯定也知道的咯。
那麼為什麼有時候將建構函式或者解構函式宣告為protected的或者private的?

通常使用的場景如下:
1。如果你不想讓外面的使用者直接構造一個類(假設這個類的名字為A)的物件,而希望使用者只能構造這個類A的子類,那你就可以將類A的建構函式/解構函式宣告為protected,而將類A的子類的建構函式/解構函式宣告為public。例如:
class A
{ protected: A(){}
  public: ....
};
calss B : public A
{ public: B(){}
  ....
};

A a; // error
B b; // ok

2. 如果將建構函式/解構函式宣告為private,那隻能這個類的“內部”的函式才能構造這個類的物件了。這裡所說的“內部”不知道你是否能明白,下面舉個例子吧。
class A
{
private:
    A(){  }
    ~A(){ }

public:
    void Instance()//類A的內部的一個函式
    {
        A a;
    }
};
上面的程式碼是能通過編譯的。上面程式碼裡的Instance函式就是類A的內部的一個函式。Instance函式體裡就構建了一個A的物件。
但是,這個Instance函式還是不能夠被外面呼叫的。為什麼呢?
如果要呼叫Instance函式,必須有一個物件被構造出來。但是建構函式被宣告為private的了。外部不能直接構造一個物件出來。
A aObj; // 編譯通不過
aObj.Instance();
但是,如果Instance是一個static靜態函式的話,就可以不需要通過一個物件,而可以直接被呼叫。如下:class A
{
private:
    A():data(10){ cout << "A" << endl; }
    ~A(){ cout << "~A" << endl; }

    public:
    static A& Instance()
    {
        static A a;
        return a;
    }

    void Print()
    {
        cout << data << endl;
    }

private:
    int data;
};

A& ra = A::Instance();
ra.Print();

上面的程式碼其實是設計模式singleton模式的一個簡單的C++程式碼實現。


還有一個情況是:通常將拷貝建構函式和operator=(賦值操作符過載)宣告成private,但是沒有實現體。
這個的目的是禁止一個類的外部使用者對這個類的物件進行復制動作。
#include <stdio.h>

class A
{
protected:
	A() { printf("A consturctor be called\n"); }
private:
	static A* a;
public:
	static A* getInstance();
};
A* A::a = NULL;
A* A::getInstance() {
	if (a == NULL)
		a = new A();
	return a;
}

int main()
{
	A* a = A::getInstance();
	if (a == NULL)
		printf("1\n");
	else
		printf("2\n");
	return 0;
}

相關推薦

建構函式定義privateprotected

將建構函式,解構函式宣告為私有和保護的,那麼物件如何建立? 已經不能從外部呼叫構造函數了,但是物件必須被構造,應該如何解決,麻煩大家幫忙說明,關於構造,解構函式宣告為私有和保護時的用法???  提出這個問題,說明你已經對c++有所思考了。 從語法上來講,一個函式被宣

父類的虛擬函式宣告private是否可以實現多型

大家,先想一想,如果把原來實現多型的父類中virtual函式宣告為private的形式,是否還可以實現多型呢。答案將由下面的程式碼給出。 #include<iostream> using namespace std; class A { private:

C++繼承:公有私有保護

情況 pre mes 派生類 它的 保持 ++ col ble 公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。 1. 公有繼承(public) 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持

關於SQL Server中將數值型別轉換字串的問題

今天將Excel中的資料匯入到資料庫表A後,某一列被自動定義成了Float資料型別,然而,我們的正式庫中的表B的相對應的列是Varchar型別的,所以,就出現了表B中所對應的列資料變成了科學計數法的形式。  今天在把一些資料匯入到SQL Server的時候遇到有個列被匯入成f

angular自定義表單控制元件

當我們打算自定義表單控制元件前,我們應該先考慮一下以下問題:是否已經有相同語義的 native (本機) 元素?如:<input type="number">如果有,我們就應該考慮能否依賴該元素,僅使用 CSS 或漸進增強的方式來改變其外觀/行為就能滿足我們

C++建構函式是否可以定義private

思考下:什麼時候建構函式需要定義為private? 1,如果一個類的建構函式只有一個且為private,這是可以編譯通過的; class Parent { private :     Parent()     {         cout<<"parent :p

給年份year定義一個巨集以判別該年份是否閏年。提示:巨集名可以定義LEAP_YEAR形參y定義巨集的形式 #define LEAP_YEAR(y) 讀者設計的字串

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int y=scanner.nextI

ECharts圖表外掛(4.x版本)使用一、關係圖force節點顯示定義影象/圖片帶分類選擇

導讀 ECharts,一個使用 JavaScript 實現的開源視覺化庫,可以流暢的執行在 PC 和移動裝置上,相容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari等),底層依賴輕量級的向量圖形庫 ZRender,提供直觀,互動豐富,可高度個性化定製的資料視覺

javascript--函式基礎函式定義/作用域回撥函式,即時函式內部私有函式返回函式函式重寫自己的函式

函式源於數學對映運算,它定義了一種關係,這種關係使一個集合裡的每一個元素對應到另一個(可能相同的)集合裡的唯一元素 javascript中: 函式是程式碼塊,一段被封閉嚴實的程式碼塊 函式是資料:使用者可以把函式作為 值 賦值給 變數 函式是一種物件,它是一類抽象類(建構函式),所有

用例子理解Java許可權修飾符privatedefaultprotected和public

許可權修飾用於限定物件起作用的範圍,也就是,在什麼地方我們能夠訪問到這個物件,在什麼地方我們訪問不到這個物件了,這裡的物件是指屬性、方法、類和介面。 一、許可權修飾符作用於屬性和方法。private,

習題 9.8 修改第6題的程式增加一個fun函式改寫main函式。改在fun函式中呼叫change和display函式。在fun函式中使用物件的引用Student &作為形參。

C++程式設計(第三版) 譚浩強 習題9.8 個人設計 習題 9.8 修改第6題的程式,增加一個fun函式,改寫main函式。改為在fun函式中呼叫change和display函式。在fun函式中

java面向物件中四種許可權privateprotectedpublic友好型詳解

俗話說沒有規矩就沒有方圓,java作為一門嚴謹的面向物件的高階程式語言,自然對許可權整個重要的問題有嚴格的控制。 Java一共有四種許可權,private (私有),public(公有)。Protected(受保護)還有友好型。 在java裡,這些語句都可以修飾類中的成員變

為什麼拷貝建構函式必須引用傳遞不能是值傳遞?

對於拷貝建構函式引用傳遞,似乎司空見慣,認為理所當然。但是被問起這個問題,的確是一片茫然,為什麼呢?去網上搜索了一下,的確有很多這方面的知識講解。我們先看一下CSDN上的一個帖子的回答:簡單的回答是為了防止遞迴引用。具體一些可以這麼講: 當 一個物件需要以值方式傳遞時,編譯器會生成程式碼呼叫它的拷貝建構函式以

關於預設建構函式的幾個錯誤認識四種情況下編譯器會生成預設建構函式

書上提到沒有定義建構函式時進行顯式初始化成員,我很納悶,不是說沒有定義建構函式的時候會合成預設建構函式嗎,自己查了下,果然查到了一下轉載的內容:不是未定義建構函式就一定會合成預設建構函式的!        假期間閒來無事,就下載了某大師的VC++視訊資料。在講到C++

java 訪問許可權private,預設預設包許可權protected繼承訪問許可權public的個人理解

package pack1; /** * Created by Kodulf on 2017/4/5. */ public class FanWenCeShi { /**

關於長鏈接短鏈接異步同步單工雙工的定義

ref duplex link targe href 超時 spa 數據包 影響 長連接:指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做在線維持。 短連接:是指通信雙方有數

如何查找Linux中一些特殊數據類型定義比如pid_t和uid_t

分享 文件 技術分享 定義 log 相關 uid linux源碼 pid 1. 查看man手冊,找到pid_t,可以通過getpid函數來看 2. 打開sys/types.h 3. 打開bits/types.h 4.

Linux監控添加自定義監控項配置郵件告警

map alt 服務端 網上 send rep pad ima 觸發 一、添加自定義監控項需求:監控某臺web的80端口連接數,並出圖。步驟:1):zabbix監控中心創建監控項目2):針對該監控項目以圖形展現第一步(需要到客戶端定義腳本)[root@zhuji ~]# v

spring boot加mybatis使用Map返回時當值空時屬性也會沒有

call pri per n-n spring fig setter 解決 strong 使用spring boot加mybatis時,設置Map返回,當值為空時屬性也會沒有,就會報錯 在application.properties中加入下面配置,將會解決這個問題。

用JWT技術SpringBoot的API增加授權保護需要自己實現userdetailservice接口

success RM -s bind 利用 proc ger start.s 自己 轉自:https://blog.csdn.net/haiyan_qi/article/details/77373900 概述 示例 https://github.com/qihaiyan