1. 程式人生 > >C++中如何在一個建構函式中呼叫另一個建構函式

C++中如何在一個建構函式中呼叫另一個建構函式

http://blog.chinaunix.net/uid-23741326-id-3385581.html

在C++中,一個類的建構函式沒法直接呼叫另一個建構函式,比如:

點選(此處)摺疊或開啟

  1. #ifndef _A_H_
  2. #define _A_H_
  3. #include <stdio.h>
  4. #include <new>
  5. class A
  6. {
  7. public:
  8.         A()
  9.         {
  10.                 printf("In A::(). m_x=%d\n", m_x);
  11.                 A(0);
  12.                 printf(
    "Out A::(). m_x=%d\n", m_x);
  13.         }
  14.         A(int x)
  15.         {
  16.                 printf("In A::(int x). x=%d\n", x);
  17.                 m_x=x;
  18.         }
  19. private:
  20.         int m_x;
  21. };

這裡第11行的呼叫A(0);只是構建了一個A的臨時物件,並沒有呼叫A(int x)來初始化自己。其執行結果是:

點選(此處)摺疊或開啟

  1. [[email protected] utcov]# ./UTest.out 
    In A::(). m_x=4268020
    In A::(int x). x=0
    Out A::(). m_x=4268020
可以看到儘管呼叫了A(0),m_x仍然沒有改變,是4268020.
正確的方法是使用placement new:


點選(此處)摺疊或開啟

  1. //A.h
  2. #ifndef _A_H_
  3. #define _A_H_
  4. #include <stdio.h>
  5. #include <new>
  6. class A
  7. {
  8. public:
  9.         A()
  10.         {
  11.                 printf("In A::(). m_x=%d\n", m_x);
  12.                 new(this) A(0);
  13.                 printf("Out A::(). m_x=%d\n"
    , m_x);
  14.         }
  15.         A(int x)
  16.         {
  17.                 printf("In A::(int x). x=%d\n", x);
  18.                 m_x=x;
  19.         }
  20. private:
  21.         int m_x;
  22. };
  23. #endif

第11行應為: new(this) A(0); 也就是用當前物件來呼叫建構函式A(int x)構建一個“新”物件。其執行結果是:

點選(此處)摺疊或開啟

  1. [[email protected] utcov]# ./UTest.out 
  2. In A::(). m_x=4268020
  3. In A::(int x). x=0
  4. Out A::(). m_x=0

可以看出,當前物件確實被改變了。

相關推薦

sping事物(一個事物方法裡面呼叫一個REQUIRES_NEW事物問題)

如果一個事物裡面呼叫另一個新增方法事物相關: eg: @Transactional public Integer addUser(User user) { Integer result = userDAO.addUser(user); try

C++類一個建構函式呼叫一個建構函式

class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "aa bb" << endl; } A(int aa, in

C++學習筆記-----在一個建構函式呼叫一個建構函式

在建構函式中呼叫另一個建構函式如果一不注意就會有無限遞迴的危險,而且建構函式的引數的不同也決定了呼叫的不同,所以特意總結了一下哪些形式的呼叫時允許的: 首先假設建構函式呼叫時引數都是外部的變數,而不是一個常量。 第一種,也是C++11支援的一種呼叫方式。在函式的初始化列表中

【轉】C++在建構函式可以呼叫一個建構函式

題目如下:問下列程式碼的列印結果為0嗎? #include <stdlib.h> #include <iostream> using namespace std; struct CLS

C++如何在一個建構函式呼叫一個建構函式

http://blog.chinaunix.net/uid-23741326-id-3385581.html 在C++中,一個類的建構函式沒法直接呼叫另一個建構函式,比如: 點選(此處)摺疊或開啟 #ifndef _A_H_ #define _A_H_ #i

C#VS一個函式呼叫一個函式的程式碼樣例

//主函式 說明:下面的函式是想求許可證的十六位編號,最後一位是許可編號的校驗碼,是以本體碼("JY" + xukbh)為基礎來計算 entities[0].XuKeZhengBianHao = "JY" + xukbh + xukebianhaojiaoyanma(xukbh);  

c++建構函式呼叫建構函式的問題

今天去一家公司面試,筆試中碰到一個題,覺得有些意思,自己當時其實也沒有完全搞清楚,這裡跟大家分享一下,也算是自己做個筆記 題目如下:問下列程式碼的列印結果為0嗎? #include <stdlib.h> #include <iostre

如何在c語言原始檔呼叫一個原始檔的函式

在原始檔A1.c中呼叫A2.c 中的函式 有兩種方法:   1.在A2.c中有完整的函式定義,在A1.c中新增一下要用到的函式原型(宣告)就可以了,例如: 在A2.c中:有函式void A2(){…}; 在A1.c中:在檔案前頭增加一行:void A2(

js檔案呼叫一個js檔案的函式

假設條件是:JS(A)要呼叫JS(B)的函式.那麼要滿足以下條件:1.要保證你所呼叫的JS必須在同一個頁面裡. 也就是JS(A)和JS(B)都要在頁面X裡.2.要保證你所呼叫的JS先於呼叫者本身被解釋.也就是JS(B)要先於JS(A)被解釋.反映在頁面上,就是JS(B)要寫

一個專案呼叫一個專案函式

http://blog.csdn.net/lins1393997412/article/details/7454817 http://blog.csdn.net/a5161027/article/details/51409845 http://blog.csdn.net/zhouguoqionghai/

C++一個工程呼叫一個 工程的 .exe檔案

用於在不同的工程檔案中,一種語言的工程A去呼叫另一種語言的的工程B。並且可能工程B中要用到工程A 中的引數變數。如果工程A中每個引數變數是一個一維矩陣,也即N*1;這時候如果需要每取變數中一個值,就需要呼叫一次工程B中.exe檔案,如果寫成for 迴圈來做的話,需要呼叫N次.

python ,如何在一個函式呼叫一個函式返回的多個值一個

在一個函式中呼叫另一個函式返回的多個值中的一個 首先,定義了一個函式 。 程式碼如下: def createDataSet(): group = array([[1.0,1.1],[1

C#在一個程序呼叫一個程序後臺程序IsBackground

最近在做一個專案時,需要在一個程序中呼叫另一個程序,這裡記錄一下, 在msdn 上有一個簡介,上面的介紹:https://msdn.microsoft.com/en-us/library/system

C# winform一個如何呼叫一個窗體的控制元件或方法

轉載地址:http://blog.csdn.net/ichenqingyun/article/details/52622340 一種是建立窗體物件的方式,通過物件呼叫控制元件或方法 例如: Form1 form1 = new Form1(); form1.Button;

QT一個工程呼叫一個工程或是C程式等

若是想要在QT中呼叫外部的一個程式,比如說QT的另一個工程或是某個C語言程式,其實非常簡單: 只需要新增一句程式碼即可:  process->startDetached("/daichu/paperKalman",QStringList()); 程式碼中“ ”中的內容

在python程式呼叫一個py檔案

在同一個資料夾下 呼叫函式: A.py檔案:     def add(x,y): print('和為:%d'%(x+y)) B.py檔案:     import A A.add

python檔案呼叫一個python檔案的類

如果是在同一個 module中(也就是同一個py 檔案裡),直接用就可以 如果在不同的module裡,例如 a.py裡有 class A: b.py 裡有 class B: 如果你要在class B裡用class A 需要在 b.py的開頭寫上 from a import A  

安卓的資料共享——從一個APP呼叫一個APP資料的方法

在Android中如何在一個APP中呼叫另一個APP中的資料呢?大致有以下五種方法可以實現 1、首選項資訊-Shared Preferences 2、檔案 3、SQLite 4、Content Provider 5、廣播 下來對上述的五種方法進行詳細的解析: 1、首先對

如何呼叫一個python檔案的程式碼

同一檔案目錄下 在b.py檔案中用下面兩條語句即可完成對a.py檔案中func( )函式的呼叫 import a #引用模組  a.func( ) 或者是 import a#應用模組  from a import func

VS2012工程呼叫一個工程的DLL檔案

建立動態庫方法: 建立動態庫是生成 .dll .lib 兩個個檔案 檔案 -> 新建 -> 專案 -> win32控制檯應用程式 專案名稱:DLLGenerator 應用程式型別:DLL  附加選項:空專案   建立原始檔dl