随笔分类 -  C++ 构造与析构

摘要:Java可以直接调用同名构造函数,仅仅起初始化的功能,并不构造新的对象,但是C++里面没有。看一下这段代码:class A {public: A() { printf("A() \n"); } A(int d) { printf("A(int) \n"); A(); } // 不能这样调... 阅读全文
posted @ 2014-10-21 16:58 findumars 阅读(573) 评论(0) 推荐(0) 编辑
摘要:C++标准明确规定,不能获取构造函数和析构函数的地址,因此也无法形成指向他们的成员函数指针。指向成员函数的指针可以,指向构造函数析构函数的不行。因为构造函数和析构函数都是没有返回值的,无法声明一个没有返回值的成员函数指针。但是通过汇编代码,有可能获得它,这是代码,但我在VC6上没有能够编译通过:#i... 阅读全文
posted @ 2014-05-23 04:32 findumars 阅读(3069) 评论(0) 推荐(0) 编辑
摘要:构造函数不能是虚函数。但有时候确实需要能传递一个指向基类对象的指针,并且有已创建的派生类对象的拷贝。通常在类内部创建一个Clone()方法,并设置为虚函数。//Listing 12.11 Virtual copy constructor#include using namespace std;cla... 阅读全文
posted @ 2014-04-28 22:38 findumars 阅读(2473) 评论(0) 推荐(0) 编辑
摘要:不是所有的函数都能自动地从基类继承到派生类中的。构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么。所以,在整个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承。另外,operator= 也不能被继承,因为它完成类似于构造函... 阅读全文
posted @ 2014-04-27 22:27 findumars 阅读(1604) 评论(2) 推荐(0) 编辑
摘要:class A {public: A() { init(); } virtual void init() { printf("A::init\n"); }};class B : public A {public: B() { init(); } virtual void init() { print... 阅读全文
posted @ 2013-10-16 04:54 findumars 阅读(374) 评论(0) 推荐(1) 编辑
摘要:class A {public: A() { printf("A \n"); } ~A() { printf(" ~A \n"); }// 这里不管写不写virtual,删除B对象的时候,都会被执行。因为这个例子是B*指针指向B对象,不是A*指针指向B对象。};class B : public A{... 阅读全文
posted @ 2013-10-08 18:25 findumars 阅读(2677) 评论(0) 推荐(2) 编辑
摘要:this指针,通常是通过ecx传递;gcc是通过堆栈传递的,是最后一个被压栈。传递this指针是为了访问成员变量。除了虚函数,所有成员函数被编译之后都是全局函数。mov eax,[ecx] ; 将第一个成员赋给eaxadd eax,[ecx+4] ; 再用第一个成员函数的值加上4,可能就是第二个成员... 阅读全文
posted @ 2013-09-15 05:08 findumars 阅读(763) 评论(0) 推荐(0) 编辑
摘要:关于虚函数,在多态当中,一定要将基类的析构函数设置为虚函数并将其实现,只有这样,才能够达到按对象构造的逆序来析构对象;否则,析构的时候,只会析构基类的那一部分,那么派生类那一部分就无法成功析构了。当指向派生类对象的指针被删除的时候,如果析构函数是虚函数(它应该如此),那么就会正确的操作——调用派生类... 阅读全文
posted @ 2013-05-09 23:05 findumars 阅读(800) 评论(0) 推荐(0) 编辑
摘要:1. 如果程序员没有提供拷贝构造函数,则编译器自动提供一个:#include "stdafx.h"#include using namespace std;class CExample {private: int a;public: // 构造函数 CExample(int b) { a = b;}... 阅读全文
posted @ 2013-05-06 22:53 findumars 阅读(574) 评论(0) 推荐(0) 编辑