C++中如何在一个构造函数中调用另一个构造函数

简介: 在C++中,一个类的构造函数没法直接调用另一个构造函数,比如: 点击(此处)折叠或打开#ifndef _A_H_#define _A_H_#include stdio.h>#include new>class A{public:        A()        {                printf("In A::().
在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. [root@tivu25 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. [root@tivu25 utcov]# ./UTest.out
  2. In A::(). m_x=4268020
  3. In A::(int x). x=0
  4. Out A::(). m_x=0

可以看出,当前对象确实被改变了。




《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
京东
亚马逊                          China pub
上学吧                          1号店




目录
相关文章
|
2月前
|
安全 编译器 程序员
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
【C++ 修饰符关键字 explicit 】掌握C++中的explicit :构造函数行为和初始化综合指南
115 3
|
4天前
|
编译器 C++
【C++从练气到飞升】03---构造函数和析构函数
【C++从练气到飞升】03---构造函数和析构函数
|
6天前
|
存储 编译器 对象存储
【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
【C++】类与对象(构造函数、析构函数、拷贝构造函数、常引用)
7 0
|
11天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-3
c++初阶------类和对象(六大默认构造函数的揭破)
|
11天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-2
c++初阶------类和对象(六大默认构造函数的揭破)
|
11天前
|
存储 编译器 C语言
c++初阶------类和对象(六大默认构造函数的揭破)-1
c++初阶------类和对象(六大默认构造函数的揭破)
|
12天前
|
编译器 C++
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
【C++类和对象】构造函数与析构函数
|
19天前
|
数据安全/隐私保护 C++
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C++中的构造函数是特殊成员函数,用于对象初始化。类型包括默认构造函数(无参数)、带参数构造函数、拷贝构造函数和移动构造函数。默认构造函数设置对象默认状态,带参数构造函数允许传递初始化值。拷贝构造函数复制已有对象,移动构造函数高效转移资源。构造函数的访问权限可控制为public、private或protected。理解构造函数有助于编写健壮的C++代码。关注公众号`Let us Coding`获取更多内容。
25 0
|
26天前
|
编译器 C++
【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数
【C++成长记】C++入门 | 类和对象(中) |类的6个默认成员函数、构造函数、析构函数
|
1月前
|
C++
C++在构造函数中如何给const成员赋值
C++在构造函数中如何给const成员赋值