constructor和destructor概述(c++ only)

原文请参考
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr374.htm

constructor和destructor概述(c++ only)
对象的初始化和清除比简单的数据结构复杂的多,这是因为类有比较复杂的内部数据结构-包括数据和行为函数。Constructor和desctorctor是用来建立和销毁类对象的特殊的成员函数。Constructor可能调用内存申请并将对象初始化。Destruction可能调用销毁和释放对象的内存资源等。

同其他的成员函数一样,constructor和destructor在类内部声明,他们可以被定义成inline或者external。Constructors可以有默认参数,同其他成员函数不同,constroctor可有成员初始化列表。下面的限制条件适用于constructors和destructors:
*Constructor和Destructor不可以也不能返回任何值
*指针与引用不能用于constructor和destructor因为他们的地址不能得到
*Constroctor不能声明成virtual
*Constructor与destructor不能声明成static, const,或者是volatile
*Unions不能包含有constructor/destructor的类对象

constructor和destructor同其他成员函数一样遵守访问限制(private/public/protected)。比如,声明一个protected的constructor,那么只有子类和友元可以使用他来生成类对象。

定义类对象时,Compiler自动调用constructors,类对象生命周期结束,自动调用destructor。Constructor不为类对象的this指针申请内存,但是可能申请比对象所需要的内存多的存储空间。一旦需要对象需要内存,constructor可以准确的调用new操作符。析构时,destructor自动释放constructor所申请的资源。使用delete操作符释放对象。

子类不会继承或者重载基类constructor或者destructor,但是子类会调用基类的constructor和destructor。Destructor可以声明成virtual。

本地或者临时类对象建立时也会调用constructor,当走出作用域,destructor会被调用。

可以在constructor或者destructor中调用成员函数。比如在class A中也可以在constructor/destructor中直接/间接调用virtual函数。这种情形下,调用的函数是a中或者A的基类定义的,而不是A的子类中定义的。这样就防止了在constructor或者destructor中访问未初始化的对象。下面是一个例子:

<code=C/C++>
#include <iostream>
using namespace std;

class A {
public:
    virtual void f() { cout << "void A::f()" << endl; }
    virtual void g() { cout << "void A::g()" << endl; }
    virtual void h() { cout << "void A::h()" << endl; }
};

class B: public A {
public:
    virtual void f() { cout << "void B::f()" << endl; }
    B() {
        f();
        g();
        h();
    }
    ~B() {
        f();
        g();
        h();
    }
};

class C: public B {
public:
    virtual void f() { cout << "void C::f()" << endl; }
    virtual void g() { cout << "void C::g()" << endl; }
    virtual void h() { cout << "void C::h()" << endl; }
};

int main(int argc, char* argv[])
{
    c obj;

    return 0;
}
</code>

上面例子的输出是:
void B::f()
void A::g()
void A::h()

虽然建立的对象是C类的,但是B的constructor并没有调用C中重载B的函数。

可以在constructor/destructor中使用typeid或者dynamic_cast操作符。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示意思是在某个位置上需要一个构造函数、析构函数或类型转换函数,但是却出现了一个左括号"(",导致编译器无法识别。可能的原因是代码中缺少了某个必要的函数定义或者函数声明语句有误。需要检查代码并修正错误。 ### 回答2: “expected constructordestructor, or type conversion before ‘(’ token”是一个编译错误,通常出现在C++程序中。它的意思是在括号前缺少构造函数、析构函数或类型转换。这个错误通常是因为代码中某个地方使用了一个没有定义的对象或类型所导致的。 这个错误的一个常见原因是当我们想要构造一个对象时,却没有正确地使用构造函数。在代码中,我们可能会在一个语句中使用多个函数调用,从而弄混了构造函数和普通的函数。例如: ``` MyClass obj(); ``` 这个代码中,我们可能想要创建一个名为obj的MyClass对象,但这样写的实际效果是声明了一个名为obj的函数,返回值类型为MyClass。正确的写法应该是: ``` MyClass obj; ``` 另一个常见错误是尝试使用一个未定义的类型。在代码中,我们可能会在声明一个对象或变量的类型时使用了一个不存在的类或类型。例如: ``` MyClass obj(); ``` 这个代码中,如果我们没有定义MyClass,就会导致编译错误。正确的写法也是使用MyClass已经正确地定义了。 最后,这个错误也可能是由于缺少必要的头文件所导致的。头文件中可能包含了一些必需的函数、类或类型声明,如果没有包含进来就会导致编译错误。为了解决这个问题,我们需要查看错误消息中给出的具体位置,并检查代码中相应的变量、类型声明以及头文件是否已经正确地定义和包含。 ### 回答3: 这个错误信息意味着编译器在代码中遇到一个不合法的语法结构,很可能是由于少了某个关键字或符号引起的。 "expected constructor" 表示编译器在此处期望的是一个构造函数,也就是说在这个位置上应该是一个构造函数的定义或声明。一般来说,当我们写下类似于 Classname::Classname() 这样的代码时,意味着我们要定义一个构造函数。 "destructor" 表示编译器在此处期望的是一个析构函数,也就是说在这个位置上应该是一个析构函数的定义或声明。一般来说,当我们写下类似于 Classname::~Classname() 这样的代码时,意味着我们要定义一个析构函数。 "or type conversion" 表示编译器在此处期望的是一个数据类型转换,也就是说我们此处应该使用某个类型的转换运算符或将一个数据类型转换为另一个数据类型。 "before ‘(’ token" 中的 '(' 符号表示错误发生的位置,也就是说在这个 '(' 的前面应该有某个关键字、符号或者标识符。一般来说这种错误往往是由于在声明函数或变量时遗漏了某个关键字,例如在前面漏掉了某个数据类型,导致编译器无法正确理解代码。 因此,要解决这个错误,我们需要查看出现错误的位置,并仔细检查代码是否缺少了某个必要的关键字或符号,或者是存在其他的语法错误。如果需要,在进行代码编写时可以注意使用编辑器的自动补全和错误提示功能,以便能够在代码出现错误时及时发现和解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值