回答乙個同事關於模板的疑問

2021-04-12 13:10:00 字數 1699 閱讀 3902

例子打頭:p34

template

class a;

p35:

void f(a);

void g(a);

void foo

------------------------------------------

上面是我同事的疑問.

----------下面是我的想法: ;

a不是乙個類,a是個類的模板,

編譯器根據給定的t值生成不同的a_*型別,

這些a_*型別一旦生成後互相在型別上來說是沒有本質聯絡的..

.a_string和a_constchar類和cfoo和cbar一樣,對編譯器來說完全沒有本質聯絡.

如果 只有書中的例項程式僅僅只有

1.  void f(a);

2.  void g(a);

這兩個宣告就只會導致兩個不同的a_string和a_constchar類出現.

但是不會導致

在a_string類裡面出現

/*template */

a_string (const a_constchar& a);

同樣a_constchar類裡面也不會定義

a_constchar(const a_string & a);

這樣的定義.

因為編譯器不會為沒有用到的東西生成任何**.(因為我不用就不要生成這些**)

template

a (const a& a);

這個模板雖然是在模板類裡面定義的,但是同樣也只有在明確的使用到了才會給予定義

3.  aa;

4.  g(a);//ok, calls template construtor.

//2.  void g(a);

但是a是屬於a型別的

上面的這兩句話僅僅導致了 在a_string類中的

template

a (const a& a);得到了啟用

生成了

class a_string;

這樣的 a_string類的**

然而a_constchar的類**卻是:

class a_constchar;

這樣就很好理解為什麼

f(a);//ok, calls built-in default copy  constructor;

(default?而不是使用那個模板的?為什麼?)

因為已經有了

a _string(const a_string& a);

//預設生成的拷貝cntor,我們看不到

存在 為什麼要去呼叫模板生成的a _string(const a_constchar& a);

呢 f的定義是:   1.  void f(a);

---------------

而g函式的定義是:

2.  void g(a);

這樣除了使用模板生成的a _string(const a_constchar& a);

就沒的使用的了辦法了.

g(a);//ok, calls template construtor.

-----------------

a_constchar和a_string是我杜撰的類名,實際編譯器生成的可能是

a_ccdsfsdkfjk和a_strsjhkiudsf之類的東西

關於Binder Thread的乙個疑問

問題描述 最近在一本書上看到這樣一句話 乙個binder服務端實際上就是乙個binder類的物件,該物件一旦建立,內部就啟動乙個隱藏執行緒。該執行緒接下來會接收binder驅動傳送的訊息。我有以下2個疑問 1 這個隱藏執行緒是在什麼地方被建立的?2 android中的系統服務也是從binder派生的...

關於非同步IO的乙個疑問

執行緒是作業系統的核心物件,多執行緒程式設計時,如果執行緒數過多,就會導致頻繁的上下文切換,這些 cpu 時間是乙個額外的耗費。所以在一些高併發的網路伺服器程式設計中,使用乙個執行緒服務乙個 socket 連線是很不明智的。於是作業系統提供了基於事件模式的非同步程式設計模型。用少量的執行緒來服務大量...

乙個redis lock的疑問

payed key valentines day 2019 is payed date format uid,t uid,date str,event name 拿到所有的檔案,進行扣錢,傳送操作 with events cacher v2.get redis lock payed key if e...