C 如何實現自動呼叫建構函式?

時間 2021-06-02 15:11:38

1樓:夏洋

如果你用C++11的話,直接這麼寫就行了:

class

UserClass

:Base

};甚至你想只寫成一句 DefValues(i, j, k); 也是有辦法的。例如:

#define FIRST(a, ...) a

#define SECOND(a, b, ...) b

#define EMPTY()

#define DEFER1(m) m EMPTY()

#define DEFER2(m) m EMPTY EMPTY()()

#define EVAL(...) EVAL32(__VA_ARGS__)

#define EVAL32(...) EVAL16(EVAL16(__VA_ARGS__))

#define EVAL16(...) EVAL8(EVAL8(__VA_ARGS__))

#define EVAL8(...) EVAL4(EVAL4(__VA_ARGS__))

#define EVAL4(...) EVAL2(EVAL2(__VA_ARGS__))

#define EVAL2(...) EVAL1(EVAL1(__VA_ARGS__))

#define EVAL1(...) __VA_ARGS__

#define IS_PROBE(...) SECOND(__VA_ARGS__, 0)

#define PROBE() ~, 1

#define CAT(a,b) a ## b

#define NOT(x) IS_PROBE(CAT(_NOT_, x))

#define _NOT_0 PROBE()

#define BOOL(x) NOT(NOT(x))

#define IF_ELSE(condition) _IF_ELSE(BOOL(condition))

#define _IF_ELSE(condition) CAT(_IF_, condition)

#define _IF_1(...) __VA_ARGS__ _IF_1_ELSE

#define _IF_0IF_0_ELSE

#define _IF_1_ELSE(...)

#define _IF_0_ELSE(...) __VA_ARGS__

#define HAS_ARGS(...) BOOL(FIRST(_END_OF_ARGUMENTS_ __VA_ARGS__)())

#define _END_OF_ARGUMENTS_() 0

#define MAP(m, first

m(first

IF_ELSE(HAS_ARGS(__VA_ARGS

; DEFER2(_MAP)()(m, __VA_ARGS__) \

/* Do nothing, just terminate */\)

#define _MAP() MAP

#define DefValue(v) Value v = Value(this)

#define DefValues(...) \

EVAL(MAP(DefValue, __VA_ARGS__))

DefValues(a

,b,c

,d,e

,f,g

,h,i

,j,k

);等效於

Valuea=

Value

(this

);Valueb=

Value

(this);.

..Valuek=

Value

(this

);如果有興趣,請學習魔法。

C 的建構函式與析構函式?

關於C 的問題,你的心中要有兩個概念,乙個是記憶體的分配,二是記憶體的初始化。C 的建構函式有兩個作用 第一,你必須要有乙個建構函式,compiler才會去給你分配記憶體。第二,分配了記憶體之後,再用建構函式去初始化記憶體。函式體為空,因為類中的每乙個成員都有預設建構函式和析構函式 否則是無法編譯的...

C 中,既然有了建構函式, 那麼拷貝建構函式存在的意義是?

白白小白 copy constructor 建立物件的時候,用同一類的物件對它進行初始化的時候會自動呼叫拷貝建構函式。Aa Ab a 或者傳參Ab f b 或者返回值是物件Af 語法 public A constA a 我們首先希望傳參的時候不會對原來的物件產生修改,所以使用了const型別 避免迴...

沒有呼叫拷貝建構函式卻提示呼叫了隱式的拷貝建構函式?

Furion W 在newNode.ptr new Node std move data 中,Node的初始化列表裡發生了這次拷貝構造 data std move std make shared std move data make shared C Reference Allocates and ...