C 建構函式 複製函式易錯點

2021-10-19 07:47:49 字數 1639 閱讀 2660

c++中複製函式在三種情況下自動呼叫:

用乙個物件初始化另乙個物件

函式的引數為物件

函式的返回值為物件

下面用幾個**片段解釋複製函式的呼叫中的一些常見「坑」:

一:預設複製函式的自動呼叫

#include

using

namespace std;

class

point

;void

showcoordinate()

private

:int x;

int y;};

intmain()

二:不存在合適的建構函式【實質上還是複製函式的問題】

#include

using

namespace std;

class

point

;point

(point& p)

;int

getx()

intgety()

private

:int x;

int y;};

point::

point

(point& p)

class

line

;private

: point p1;

point p2;};

intmain()

為什麼出現這種情況,實質上是因為line的建構函式中使用了無引數的建構函式,但是只有當沒有編寫建構函式時,系統會自動生成乙個沒有引數的建構函式,而編寫了建構函式之後系統並不會自動生成

乙個治標不治本的方法是,在class point中加入乙個無引數的建構函式。但是問題顯而易見,麼有引數的建構函式並麼有實際意義。所以只能通過類的組合,將point類內嵌在line類中。

將其改為:

line

(point temp_p1, temp_p2):p1

(temp_p1),p2

(temp_p2)

;

至此,可以編寫計算線段長度的程式:

#include

#include

using

namespace std;

class

point

;point

(point& p)

;int

getx()

intgety()

private

:int x;

int y;};

point::

point

(point& p)

class

line

;double

getlen()

;private

: point p1;

point p2;};

//計算線段長度,比較簡單,可以設定為內聯

inline

double line::

getlen()

intmain()

C 函式過載易錯點

1.函式過載跟返回類型別無關。如果定義一下兩個函式 int func void func 如果int a func 那麼編譯器知道呼叫第乙個函式。但是c 允許直接使用函式而不需要返回值。func 這個時候就不知道呼叫哪個函式,編譯報錯。2.二義性。特別是double型別的隱式轉換的二義性。int m...

C語言 strlen 函式易錯點

strlen函式解析 include include includeint main void int len2 strlen c2 printf len2 d n len2 error.len2 9 char c3 int len3 strlen c3 printf len3 d n len3 l...

C語言 strlen 函式易錯點

code class cpp strlen函式解析 include include include int main void int len2 strlen c2 printf len2 d n len2 error.len2 9 char c3 int len3 strlen c3 printf...