首页 > C++ Primer 读书笔记 - 第十三章

C++ Primer 读书笔记 - 第十三章

1. Initialization和Assignment不一样。其中Initialization包括direct-initialization (如A a(...))和copy-initialization (如 A a = b;)

    注意A a = b为copy-initialization,

    而A a; A b; a = b;为Assignment。

2. We cannot copy objects of the IO types, so we cannot use copy-initialization on objects of these types.

3. As the copy constructor is used (implicitly) to pass and return objects to and from objects, it usually should not be made explicit.

4. 为了防止复制,我们可以把拷贝构造函数设置为private,同时只在类中声明,但不在任何地方定义。

5. Rule of Three, if you need a destructor, then you need all three copy-control members.

6. Even if we write our own destructor, the synthesized destructor is still run.

7. 编译器会为我们生成一个拷贝构造函数,但是一旦我们自己来写拷贝构造函数,那么我们必须对每个成员变量显示赋值,否则成员变量由其自身的默认构造函数来赋值。

8. 简单的Smart pointer示例。

#include 
using std::ostream; using std::cout; using std::endl;
#include <string>
#include 
using std::size_t;
/* smart pointer class: takes ownership of the dynamically allocated*                      object to which it is bound * User code must dynamically allocate an object to initialize a HasPtr* and must not delete that object; the HasPtr class will delete it
*/
//private class for use by HasPtr only
class U_Ptr {friend class HasPtr;int *ip;size_t use;U_Ptr(int *p): ip(p), use(1) { }~U_Ptr() { cout << "U_Ptr destructor" << endl; delete ip; }
};class HasPtr {
public:// HasPtr owns the pointer; p must have been dynamically allocatedHasPtr(int *p, int i): ptr(new U_Ptr(p)), val(i) { }// copy members and increment the use countHasPtr(const HasPtr &orig):ptr(orig.ptr), val(orig.val) { ++ptr->use; }HasPtr& operator=(const HasPtr&);// if use count goes to zero, delete the U_Ptr object~HasPtr() { if (--ptr->use == 0) {cout << "HasPtr destructor" << endl;delete ptr; }} friend ostream& operator<<(ostream&, const HasPtr&);// copy control and constructors as before// accessors must change to fetch value from U_Ptr objectint *get_ptr() const { return ptr->ip; } int get_int() const { return val; }// change the appropriate data membervoid set_ptr(int *p) { ptr->ip = p; }void set_int(int i) { val = i; }// return or change the value pointed to, so ok for const objects// Note: *ptr->ip is equivalent to *(ptr->ip)int get_ptr_val() const { return *ptr->ip; } void set_ptr_val(int i) { *ptr->ip = i; }
private:U_Ptr *ptr;        // points to use-counted U_Ptr classint val;
};HasPtr& HasPtr::operator=(const HasPtr &rhs)
{++rhs.ptr->use;     // increment use count on rhs firstif (--ptr->use == 0) {cout << "operator= delete" << endl;delete ptr;    // if use count goes to 0 on this object, delete it
    }ptr = rhs.ptr;      // copy the U_Ptr objectval = rhs.val;      // copy the int memberreturn *this;
}ostream& operator<<(ostream &os, const HasPtr &hp)
{os << "*ptr: " << hp.get_ptr_val() << "	val: " << hp.get_int() << endl;return os;
}int main()
{int *obj = new int(0);HasPtr ptr1(obj, 42);HasPtr ptr2(ptr1);cout << "(1) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;ptr1.set_ptr_val(42); // sets object to which both ptr1 and ptr2 pointptr2.get_ptr_val();   // returns 42
cout << "(2) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;ptr1.set_int(0);   // changes s member only in ptr1ptr2.get_int();    // returns 42ptr1.get_int();    // returns 0
cout << "(3) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;
}

9. Define Valuelike Class

    构造函数和析构函数

转载于:https://www.cnblogs.com/null00/archive/2013/05/31/3107928.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • C++11标准中可以为模板定义别名,比如 template using ptr=std::shared_ptr; //这里模板定义ptr为智能指针std::shared_ptr定义的别名 所以实际应用中可以借此来简化代码,比如 #include #include

  • 先说结论,智能指针都是非线程安全的。 多线程调度智能指针 这里案例使用的是shared_ptr,其他的unique_ptr或者weak_ptr的结果都是类似的,如下多线程调度代码: #include #include #include #include #i...

  • 文章目录unique_ptr 智能指针的实现shared_ptr 智能指针的实现指针类型转换 unique_ptr 智能指针的实现 一个对象只能被单个unique_ptr 所拥有。 #include using namespace std;/*增加模板类型,保证智能指针的类型是由传入的类型决定的*/ t...

  • 文章目录weak_ptr描述声明作用原理实现函数成员使用总结 weak_ptr描述 声明 头文件: 模版类:template class weak_ptr 声明方式:std::weak_ptr statement 作用 根据boost库的官方描述,weak_ptr是...

  • 文章目录shared_ptr描述声明作用原理实现函数使用关于shared_ptr循环引用问题 shared_ptr描述 声明 shared_ptr属于C++11特性中新加的一种智能指针,它的实现方式是模版类,头文件 template class shared_ptr 所以使用shared...