【问题标题】:Defining an object with a pointer to an object and operator new in c++ [duplicate]在c ++中使用指向对象和运算符new的指针定义对象[重复]
【发布时间】:2015-07-08 17:54:54
【问题描述】:

关于使用指向对象的指针定义对象的简单示例。我们定义一个对象A *a = new A(123.4);,然后用A *b = new A(*a);定义另一个对象

我不明白这对 b(pointer to) 对象究竟是如何工作的?复制构造函数如何在此处启动并将值初始化为与对象 a 相同?我认为要让它工作,我们应该在类中声明一个自定义的复制构造函数。

#include <iostream>
using namespace std;

class A {
public:
    A(float v) { A::v = v; }
    float v;
    float set(float v) {
        A::v = v;
        return v;
    }
    float get(float v) {
        return A::v;
    }
};

int main() {
    A *a = new A(123.4);
    A *b = new A(*a);

    cout << a->v << endl;
    cout << b->v << endl;

    a->v = 0.0;
    cout << a->v << endl;
    cout << b->v << endl;

    b->v = 1.0;
    cout << a->v << endl;
    cout << b->v << endl;

    return 0;
}

程序的输出是:

123.4
123.4
0
123.4
0
1

提前致谢。

【问题讨论】:

  • 编译器为你生成了一个拷贝构造函数。它将执行成员变量的浅拷贝,这在您的情况下已经足够了。
  • 每个类都有一个拷贝构造函数,不管你是否自己定义。
  • @KerrekSB 如果 AndyG 的回答和他回答下面的评论是正确的,那么你所说的不是真的......或者我误解了一些东西
  • @tobi303:这取决于你想变得多么迂腐。总是声明一个复制构造函数(这就是我说“有”时的意思)。如果不是用户定义的,则在首次使用odr时隐式定义,可能定义为删除。

标签: c++ object polymorphism


【解决方案1】:

编译器为您生成了一个复制构造函数。它将执行成员变量的浅拷贝,这在您的情况下已经足够了。

来自Wikipedia

C++中的

特殊成员函数是编译器在使用时会自动生成的函数,但程序员没有明确声明。特殊的成员函数是:

  • 默认构造函数(如果没有显式声明其他构造函数)
  • 复制构造函数 如果没有明确声明移动构造函数或移动赋值运算符。如果声明了析构函数,则不推荐生成复制构造函数。
  • 如果没有明确声明复制构造函数、移动赋值运算符或析构函数,则移动构造函数。
  • 如果没有明确声明移动构造函数或移动赋值运算符,则复制赋值运算符。如果声明了析构函数,则生成一个副本 赋值运算符已弃用。
  • 如果没有显式声明复制构造函数、复制赋值运算符或析构函数,则移动赋值运算符。
  • 析构函数

【讨论】:

  • 这是否意味着:如果编译器找不到其中任何一个的用法,他将不会创建函数?
  • @tobi303:正确。如果您想强制创建它们,请查看使用 = default;(C++11 及更高版本)
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2019-10-11
  • 2011-02-12
  • 2014-01-02
  • 2018-10-12
  • 2017-09-22
相关资源
最近更新 更多