首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pg:224 Stroustrup - C++编程语言,3E

pg:224 Stroustrup - C++编程语言,3E
EN

Stack Overflow用户
提问于 2012-03-07 10:17:51
回答 2查看 237关注 0票数 1
代码语言:javascript
复制
struct Date {
  int d, m , y;

  void init_date(Date& d, int, int, int);
  void add_year(int n);
  void add_month(Date& d, int n);
  void add_day(Date& d, int n);
}

Date my_birthday;
void f()
{
  Date today;
  today.init(16, 10, 1996);
  my_birtday.init(30, 12, 1950);

  Date tomorrow = today;
  tomorrow.add_day(1);
  // ...
}

问题A:在上面的片段中的,不是:日期明天=今天;错误的是,在struct中没有提供“复制构造函数”。我知道编译器会自动生成一个“默认构造函数”--但是我不知道它到底做了什么或者它是如何工作的(它可以调用一个成员类的默认构造函数,但是它不会初始化: int;之类的东西)。有人能澄清编译器的默认构造函数是如何工作的吗?

问题B:我们必须插入这样的内容: const & Date(const & r);对吗?但是,上面的构造函数意味着我们传递给它一个参数(对“今天”的引用)。那么,如何将“初始化”:“日期明天=今天”转换为函数调用:日期明天(今天);这里有什么“魔术”发生吗?

问题C:操作符的格式是什么,新的?Stroustrup以不同的方式使用它,但是没有明确列出它的所有用途。到目前为止,我可以找到:新的;新的类型;新的类型(大小);新的类型;这个列表/给出了什么地方吗?我漏掉了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-07 12:40:07

答:编译器将隐式地生成一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数(如果你不自己声明这些函数),如果你不声明任何构造函数,编译器会生成一个默认的构造函数。每个基类和类的成员都将递归地执行这些操作。

默认-初始化一个数字类型(如int)什么也不做,没有初始化它。因此,在Date today;之后,today的成员具有未指定的值。

因此,您的类的行为就好像您定义了以下内容:

代码语言:javascript
复制
// Destructor
~Date() {}

// Default constructor
Date() {}

// Copy constructor
Date(Date const & x) : d(x.d), m(x.m), y(x.y) {}

// Copy-assignment operator
Date & operator=(Date const & x) {
    d = x.d;
    m = x.m;
    y = x.y;
    return *this;
}

B.上面的答案--在编译器正在为您生成这些函数的意义上,出现了“魔力”。

任何体面的C++ book,包括你在问题标题中提到的那个,都会告诉你new是如何工作的。通常,当您需要精确控制对象的生存期时,就会使用newdelete。你的具体案例:

  • new Type[size]创建一个size对象数组,每个对象都是默认初始化的。必须使用delete[].
  • new Type(size)来删除它,创建一个对象,并使用size值初始化它。这必须使用delete.
  • new Type删除,创建一个默认初始化的对象。同样,必须使用delete.

删除此内容。

还有其他一些标准表格:

  • new Type[size]()new Type()将值-初始化而不是默认-初始化对象;这意味着数值类型将初始化为零,指向null的指针(而不是左) uninitialised.
  • new (std::nothrow) Type将给出一个空指针,而不是抛出std::bad_alloc,如果fails.
  • new (pointer) Type将在pointer指定的内存中构造一个对象,而不是分配内存。您不能删除这个对象;相反,您必须调用它的析构函数(object->~Type())来销毁它,而不尝试释放内存。这不是你经常做的事。--

您也可以定义自己的表单,但这远远超出了这个问题的范围。

您应该避免使用new,除非您真正需要独立于任何其他对象或代码块来控制对象的生存期。当您这样做时,使用RAII技术(特别是智能指针)确保它们被正确删除是一个非常好的主意;手动跟踪它们可能很困难。

票数 1
EN

Stack Overflow用户

发布于 2012-03-07 10:24:47

( A)默认副本构造函数执行浅拷贝。因为您只有POD类型,所以它将按照您期望的方式工作,因此它将是正确的。

( B) const Date& Date(const Date& r);错误。Data::Date是一个构造函数,它不能是const,也不能有返回类型。如果要实现复制构造函数,只需编写Date(const Date& r),但在本例中不需要。

代码语言:javascript
复制
Date tomorrow = today;

是相同的

代码语言:javascript
复制
Date tomorrow(today);

调用复制构造函数,而不是函数。

( C)大话题,谷歌的new关键字,我相信它是很好的文档。您可以使用new在动态存储中分配内存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9599556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档