初始化列表中的 C++ 自身

c++ self in initialisation list

本文关键字:C++ 自身 列表 初始化      更新时间:2023-10-16

我有这个代码片段

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'

这是怎么做到的?

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

你必须初始化Osoba的成员,就像你在另一个构造函数中所做的一样。

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

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

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

换句话说,如果你有

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

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

请注意,其他面向对象的语言使用不同的方法...

有关C++中确切发生的情况的说明,请参阅本文。

如果您更喜欢法律术语描述,这是 C++ 标准 12.7.4 中的规定:

成员功能,包括虚拟 函数(10.3),可以在 建造或销毁(12.6.2)。 调用虚函数时 直接或间接来自 构造函数(包括来自 数据成员的 mem 初始值设定项)或 从析构函数和对象到 调用应用的是对象 正在建设或破坏中, 调用的函数是 中定义的函数 构造函数或析构函数自己的 类或在其基础之一中,但不是 在类中重写它的函数 派生自构造函数或 析构函数的类,或重写它 在 的其他基类之一中 派生最多的对象 (1.8)。如果 虚函数调用使用显式 类成员访问 (5.2.5) 和 对象表达式是指对象 正在建设或破坏中,但 其类型既不是构造函数,也不是 析构函数自己的类或其类之一 基数,调用的结果是 定义。

首先,构造函数不是随便什么方法,你不能只使用 at 作为突变器方法。

可是我的想法是否正确,你们的班级有两个领域,imie 和 wiek?

只需再次执行初始化代码,这次使用 x.imie 和 x.wiek 作为输入