c 學習筆記(17)

2021-10-06 01:28:35 字數 2436 閱讀 6431

類模板中的成員函式建立時機

類模板中成員函式和普通類中成員函式建立時機是有區別的

普通類中的成員函式一開始就可以建立

類模板中的成員函式在呼叫時才建立

template

<

class

t>

class

myclass

void

func2()

//因為在呼叫之前,無法確定obj的資料型別,所以成員函式不會被建立

} myclassm;

m.func1()

; m.

func2()

;//當確定了t的資料型別時,就可以建立成員函式並呼叫

類模板物件做函式引數

類模板例項化出的對選哪個,像函式傳參的方式

一般有三種方式

1.指定傳入的型別——直接顯示物件的資料型別

2.引數模板化——將物件中的引數變為模板進行傳遞

3.整個類模板化——將這個物件型別模板化進行傳遞

template

<

classt1,

class

t2>

class

person

t1 m_name;

t2 m_age;

void

show()

}//指定傳入型別

void

printperson

(personint>

&p);

//引數模板化

template

<

classt1,

class

t2>

void

printperson

(person

&p);

typeid

(t1)

.name();

//顯示t1的資料型別,並以字串的形式顯示出來

//整個類模板化

template

<

class

t>

//直接將類的資料型別也處理為模板

void

person

(t &p);

personint>p(

"li"

,100

);

類模板與繼承

注意事項:

1.當子類繼承的父類是乙個類模板時,子類在宣告的時候,要制定出父類中t的型別

2.如果不指定的話,編譯器無法給子類分配記憶體

3.如果想靈活孩子定出父類中t的型別,子類也需變為類模板

template

<

class

t>

class

base

;class

son:

public base<

int>

//必須要知道父類中t的型別

;son s1;

//如果想靈活的指定父類中t的型別,子類也需要變為模板

template

<

classt,

class

t1>

class

son:

public base

son<

int,

char

>s2;

//需要同時指定出,父類和子類的資料型別

類模板成員函式的類外實現

template

<

classt1,

class

t2>

class

person

tamplate<

classt1,

class

t2>

person

::person

(t1 name,t2 age)

;//指明作用域,並說明是類模板的建構函式實現

類模板分檔案編寫

問題:類模板中的成員函式建立時機是在呼叫階段,導致分檔案編寫時鏈結不到

解決方式1:直接包含.cpp原始檔

解決方式2:將宣告和實現寫到同乙個資料夾中,並更改字尾名為.hpp,hpp時約定的名稱,並不是強制

//建立**件

#pragma once

//防止標頭檔案重複包含

//在**件中儲存類的定義

//建立cpp檔案 儲存類外的成員函式定義

#include

"person.h"

//外部函式呼叫時,標頭檔案不能包含**件,要包含cpp檔案

//因為定義時,模板未建立成員函式,所以只引用**件,無法發現成員函式

//也可以將宣告和實現寫在一起,將字尾名改為hpp

#include

"person.hpp"

C 學習筆記17 繼承

繼承 物件導向中的繼承指類之間的父子關係 子類擁有父類的所有成員變數和成員函式 子類就是一種特殊的父類 子類物件可以當作父類物件使用 子類可以擁有父類沒有的方法和屬性 繼承時候的訪問級別設定會影響到成員的訪問級別 class child parent 等價於class child private p...

C 學習筆記 (17)繼承

類的繼承或類的派生 把類按照其之間的關係組成的層次結構,稱之為類的繼承或類的派生。基類和派生類 水果是一種基類,桃 梨 蘋果是派生類 派生類可以繼承基類裡的屬性 欄位和方法,然後加上自己特殊的屬性 欄位和方法。派生的語法格式 類修飾符 class 派生類名 基類名 訪問控制問題public 都可以訪...

C語言學習筆記 17

1.聯結器 c語言有個思想是分別編譯,也就是把乙個c語言的專案分成若干個源程式,讓他們在不同的時候單獨進行編譯,然後在恰當的時候整合到一起。這個整合的過程就是由聯結器完成的。大多數時候,聯結器和編譯器都是分開的,聯結器本身並不懂得太多c語言的語法規則。因為他一般不與c直接接觸,我們想想之前說過c語言...