C++不能显式调用构造函数,会生成匿名对象,这点与Java完全不一样!

Java有super(),但是C++里面没有。看一下这段代码:

class A {
public:
    A() { printf("A() \n"); }
    A(int d) { printf("A(int) \n"); A(); }  // 不能这样调用构造函数!会生成另一个匿名对象
    ~A() { printf(" ~A \n"); }
    void ddd() { printf(" ddd \n"); }
};

int main(int argc, char* argv[])
{
    A aaa(9);
    aaa.ddd();

    getchar();
    return 0;
}

输出结果是:
A(int)
A()
~A
ddd

但是如果改成
A(int d) { printf("A(int) \n"); }
输出结果是:
A(int)
ddd

充分证明这中间有生成和销毁过一个匿名对象!并且我目前不知道有没有官方解决方案,如果要定义init()函数,那还是算了吧。

参考:
http://www.cnblogs.com/xkfz007/archive/2012/05/11/2496447.html

一些讨论:

http://bbs.csdn.net/topics/80415554

---------------------------------------------------------------------

但是可以显式调用析构函数,参考:

http://fpcfjf.blog.163.com/blog/static/55469793201362442256498/

时间: 2024-11-05 16:32:48

C++不能显式调用构造函数,会生成匿名对象,这点与Java完全不一样!的相关文章

C++中构造函数详解及显式调用构造函数

C++构造函数详解及显式调用构造函数 c++类的构造函数详解                        一. 构造函数是干什么的class Counter{public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型         Counter()         {                m_value = 0;         }private:          // 数据成员         int m_val

C++中如何显式调用构造函数

#include <new> class A { public: A(); A(int); ... }; A * pA = (A *) malloc( sizeof(A) ); new (pA) A; // 调用A() A * pAA = (A *) malloc( sizeof(A) * 10 ); for (int i = 0; i < 10; ++i) new (pAA + i) A(i); // 调用A(int) 以上用法也称为放置构造,它是与第三方内存管理的标准接口,必须 in

C++构造函数详解及显式调用构造函数

一. 构造函数是干什么的class Counter{public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型         Counter()         {                m_value = 0;         }private:          // 数据成员         int m_value;}       该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数->由构造函数完成成员

linux下动态链接库(.so)的显式调用和隐式调用

进入主题前,先看看两点预备知识. 一.显式调用和隐式调用的区别 我们知道,动态库相比静态库的区别是:静态库是编译时就加载到可执行文件中的,而动态库是在程序运行时完成加载的,所以使用动态库的程序的体积要比使用静态库程序的体积小,并且使用动态库的程序在运行时必须依赖所使用的动态库文件(.so文件),而使用静态库的程序一旦编译好,就不再需要依赖的静态库文件了(.a文件). 动态库的调用又分为显示和隐式两种方式,区别如下: 1. 隐式调用需要调用者写的代码量少,调用起来和使用当前项目下的函数一样直接:而

线程系列10,无需显式调用线程的情形

通常,我们会通过线程的构造函数先创建线程再使用线程.而实际上,.NET中有些类提供的方法,其内部就是使用多线程处理的.一些封装了多线程.异步处理方法的类都符合了"事件驱动异步模式(event-based asynchronous pattern)".以System.ComponentModel下的BackgroundWorker类来说,该类就符合这种模式. BackgroundWorker类属性:WorkerSupportsCancellation:设置为true表示允许取消Worke

C++子类中显式调用基类函数

1 #include <iostream> 2 using namespace std; 3 4 class thebase { 5 public: 6 virtual void basePrint() { 7 cout << "the base class basePrint() function." << endl; 8 } 9 10 void basePrint2() { 11 cout << "the base clas

C++如何显式调用常成员函数

C++的常成员函数与同名成员函数重载时,该如何显式调用常成员函数? 具体的一个小例子: #include <iostream> using namespace std; class C1 { public: void fun() { cout<<1<<endl; } void fun() const { cout<<2<<endl; } }; 可用如下方法调用常成员函数 void fun() const : C1 c1; ((const C1&a

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一

mybatis-generator生成数据对象

mybatis-generator生成数据对象 步骤一:在pom文件中添加build的插件 <build> <finalName>doudou</finalName> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> &