C++primer pe13_15(还有13——4、9、12中NoName类的指针疑惑)

来源:互联网 发布:4g网络优化先培训骗局 编辑:程序博客网 时间:2024/05/18 01:48
    new Sales_item;    new Sales_item;    new Sales_item;    new Sales_item;//这些必须主动delete//计算析构函数的调用次数,在析构函数中定义了一个打印语句以供判断#include"head.h"#include"Sales_item.h"void fcn(const Sales_item *trans, Sales_item accum){//函数内是三次,item1和item2,还有一个accum的副本Sales_item item1(*trans), item2(accum);if(!item1.same_isbn(item2)) return;if(item1.avg_price() <= 99){std::cout << "test(in):" << std::endl; return;}else if (item2.avg_price() <= 99) return;}int main(){Sales_item item1,item2;Sales_item *p = &item1;//p = new Sales_item;//对照组:p指向正常的动态分配对象,delete没问题fcn(&item1, item2);std::cout << "test1:" << std::endl;delete p;//先调用一次delete p, 再在结束默认删item1,重复?其实是这里是一个强制用delete删除一个non-dynamic-obj的错误吧//不等到最后冲突,在此句执行完就弹错了(因为是内存错误把,当即生效),那些报错声明还是看不太懂,一大堆地址,还有rw-p之类的权限,每个地址的权限?std::cout << "test2:" << std::endl;    new Sales_item;    new Sales_item;    new Sales_item;    new Sales_item;//要注意析构函数的调用条件,这些必须主动delete }

小结:析构不能overload,但是编译器始终都能合成一个析构函数并且始终都会运行。这也证实出了overload功能确实只是compiler的一个小功能,overload参数列表不同只是对coder的要求,compiler本身是可以随意去构建重载的。

rule of three:析构函数需要另外两个复制控制,尽管不能通过打印输出之类的验证他们一起运行过(Class a = new Class;也是一样,虽然此复制构造过程用到赋值操作符,但是显示不出来,只显示用过一次copy-constructor)

存疑:13.4  13.9   13.12牵连的Noame类,有个私有成员,是std::string *pstring;关于此指针的初始化,复制,析构等问题

到底什么是所谓的复制指针指向的string对象而非复制指针,是指复制指针内容么(也就是两指针同指向一个对象)?这不叫复制指针?如果是真正意义的复制string对象,那么string对象存在哪?类对象成员中只有一个string指针,没有string对象的位置。
原创粉丝点击