初始化列表中的 C++ 自身
c++ self in initialisation 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'
这是怎么做到的?
你不能这样调用构造函数。好吧,你可以,但是发生的事情是创建一个无名的临时对象。编写复制构造函数而不引用其他构造函数。此外,如果使用 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 作为输入
- C++模板类继承自身
- 即发即弃 std::线程对象清理自身
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 有没有办法在另一个函数中加入线程?(即超出其自身范围)
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 有没有办法检测自身内部的类恒常性?
- 如何在 c++ 中创建一个可以将自身保存为变量的类?
- 对象如何将自身添加到对象类中的向量中?
- 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?
- 检查彩虹数组(检查数组的反向样式是否与自身匹配)
- 如何向自身添加链表?
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 为什么我的类节点覆盖自身而不是创建新的节点对象
- std::文件系统根路径如何将自身作为父路径?
- 包含自身向量的结构
- 返回自身内部的双重嵌套类的成员函数,该类继承自从自身继承的类
- 使用类作为模板参数在其自身的延迟中