初始化列表中的c ++ self

时间:2011-05-17 12:28:20

标签: c++ initialization-list

我有这段代码

class Osoba{
         Osoba(char* imie,int wiek){                         
                     this->imie=new char[strlen(imie)+1];
                     strcpy(this->imie,imie);
                     this->wiek=wiek;
                     cout<<"Utworzono Osobe "<<this->imie<<endl;
         }
         Osoba(Osoba& x){
                 Osoba(x.imie,x.wiek);
         }
[...]

当我调用复制构造函数时,它不起作用(创建并销毁对象)。

编辑: 如果我使用

         Osoba(Osoba& x): Osoba(x.imie,x.wiek){

我得到type 'class Osoba' is not a direct base of 'Osoba'

这是怎么做到的?

4 个答案:

答案 0 :(得分:10)

你不能这样调用构造函数。嗯,你可以,但会发生什么是无名的临时对象被创建。编写复制构造函数而不引用其他构造函数。此外,如果使用std :: string而不是char *,则不需要复制构造函数。如果你坚持使用char *,你还需要一个析构函数和赋值运算符。

答案 1 :(得分:3)

您必须初始化Osoba的成员,就像在其他构造函数中一样。

您只能在C ++ 2011中重用构造函数(使用其他语法)。

答案 2 :(得分:1)

除了创建另一个不同的对象外,你不能调用构造函数。

如果需要在构造函数之间有一些共同的代码,可以将它放在一个单独的方法中并调用该方法。请注意,在构造函数中,您可以调用对象的方法,但virtual方法不会调度派生类。

换句话说,如果你有

struct Foo
{
    virtual void doit() { ... }
    Foo() {
        doit();
    }
};

struct Bar : Foo
{
    virtual void doit() { ... }
};

Bar的构造函数中,被调用的doit的实现将是Foo中定义的实现,因为在派生对象的基本部分的构造函数中,对象只是一个“基础”对象。只有在构造函数的结尾,它才会在“derived”构造函数中执行任何最终存在的代码之前成为“派生”对象。

小心其他面向对象的语言使用不同的方法......

有关C ++ see this article中完全发生的事情的解释。

如果你喜欢法律术语的描述,这就是C ++标准12.7.4中所述的内容:

  

会员功能,包括虚拟   函数(10.3),可以在调用期间调用   建造或毁坏(12.6.2)。   调用虚函数时   直接或间接来自   构造函数(包括来自   数据成员的mem-initializer)或   从析构函数,和对象到   调用适用的是对象   正在建设或破坏中   被调用的函数是在中定义的函数   构造函数或析构函数自己的   上课或在其中一个基地,但不是   一个函数在类中重写它   派生自构造函数或   析构函数的类,或者覆盖它   在其中一个基类中   最派生的对象(1.8)。如果   虚函数调用使用显式   类成员访问(5.2.5)和   object-expression指的是对象   正在建设或破坏但是   它的类型既不是构造函数也不是   析构函数自己的类或其中的一个   基地,通话的结果是   未定义。

答案 3 :(得分:0)

首先,构造函数不仅仅是任何方法,你不能只使用at作为mutator方法。

说, 我是否正确地认为你的班级有两个领域,imie和wiek?

再次执行init代码,这次使用x.imie和x.wiek作为输入