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以不同的方式使用它,但是没有明确列出它的所有用途。到目前为止,我可以找到:新的;新的类型;新的类型(大小);新的类型;这个列表/给出了什么地方吗?我漏掉了什么吗?
发布于 2012-03-07 12:40:07
答:编译器将隐式地生成一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数(如果你不自己声明这些函数),如果你不声明任何构造函数,编译器会生成一个默认的构造函数。每个基类和类的成员都将递归地执行这些操作。
默认-初始化一个数字类型(如int)什么也不做,没有初始化它。因此,在Date today;之后,today的成员具有未指定的值。
因此,您的类的行为就好像您定义了以下内容:
// 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是如何工作的。通常,当您需要精确控制对象的生存期时,就会使用new和delete。你的具体案例:
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技术(特别是智能指针)确保它们被正确删除是一个非常好的主意;手动跟踪它们可能很困难。
发布于 2012-03-07 10:24:47
( A)默认副本构造函数执行浅拷贝。因为您只有POD类型,所以它将按照您期望的方式工作,因此它将是正确的。
( B) const Date& Date(const Date& r);错误。Data::Date是一个构造函数,它不能是const,也不能有返回类型。如果要实现复制构造函数,只需编写Date(const Date& r),但在本例中不需要。
Date tomorrow = today;是相同的
Date tomorrow(today);调用复制构造函数,而不是函数。
( C)大话题,谷歌的new关键字,我相信它是很好的文档。您可以使用new在动态存储中分配内存。
https://stackoverflow.com/questions/9599556
复制相似问题