读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数

在之前的理论上调用对象的operator=是这样做的

    void swap(A& x)
    {
        std::swap(a, x.a);
    }
    A& operator=(const A& a)
    {
        A temp = a;
        swap(temp);
        return *this;
    }

上面的代码看起来有点麻烦,但它是一个好办法。

我们可以在std里面特化我们的swap

class A
{
private:
    int a;
public:
    void swap(A& x)//防止写成friend,我们给他一个接口
    {
        std::swap(a, x.a);
    }
    A(int x) :a(x){}
    A& operator=(const A& a)
    {
        A temp = a;
        using std::swap;
        swap(*this,temp);
        return *this;
    }
    void display()
    {
        cout << a << endl;
    }
};

namespace std
{
//    template<>书上加了,但我发现并不能
    void swap<A>(A &s1, A &s2)//这个<A>是特化,和重载分道扬镳
    {
        s1.swap(s2);
    }
}

int main()
{
    A a(1);
    A b(2);
    b.display();
    b = a;
    b.display();
}

当class也是template以后再说

时间: 2024-07-30 13:42:29

读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数的相关文章

读书笔记_Effective_C++_条款二十二:将成员变量声明为private

1.格式统一 在调用的时候,不会去想有没有(),一律是有get(),或者set()之类的. 2.封装 能直接访问得越少,表明封装性越高, 封装性越高,我们的顾虑就少了, 例如:我们a.data*0.9的时候,不需要调用出来*0.9.只需用public的get()来调用在修改一下就好了 为什么不使用protected 在没有继承下的class下protected和private是一样的 但在发生了继承的情况下,原来只能用父类函数调用的数据,因为protected,完全暴露了出来. 而且,用了pri

读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数

class A { private: int a; public: A(int x) :a(x){} A operator*(const A& x) { return A(a*x.a); } }; int main() { A a(2); A b = a*a;//没有问题 A b = a * 2;//由于构造函数没有explicit,这里隐式转换了,也没有问题 A b = 2 * a;//出问题了 } 老师讲过,一种是类的member函数,一种是non-member函数, 但我们为了封装性,尽量

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

Effective C++ 条款25 考虑写出一个不抛出异常的swap函数

1. swap是STL的一部分,后来成为异常安全性编程(exception-safe programming)(见条款29)的一个重要脊柱,标准库的swap函数模板定义类似以下: namespace std{ template<typename T> swap(T& lhs,T& rhs){ T temp(lhs); lhs=rhs; rhs=temp; } } 只要T类型支持拷贝构造以及拷贝赋值,标准库swap函数就会调用T的拷贝构造函数和拷贝构造操作符完成值的转换,但对于某

读书笔记_Effective_C++_条款二十一:当必须返回对象时,别妄想返回其reference

在栈空间的临时成员变量在函数生命期结束后无法传出 friend A& operator*(const A& a, const A& b) { A temp; temp.data = a.data*b.data;//a,b的成员变量相乘 return temp; } 既然栈空间不行,试试堆空间 friend A& operator*(const A& a, const A& b) { A *temp=new A; temp.data = a.data*b.da

读书笔记_Effective_C++_条款二十三:宁以non-member、non-friend替换member函数

有下面一种情况 class A { private: int a; int b; public: A(int x, int y) :a(x), b(y){} void a_display(){ cout << a << endl; } void b_display(){ cout << b << endl; } }; 你想输出全部的时候 member函数情况 void display(){cout<<a<<b<<endl;

Effective C++笔记_条款25考虑写出一个不抛出异常的swap函数

1 // lib中的swap 2 namespace std { 3 template<typename T> 4 void swap (T& a, T& b) 5 { 6 T temp(a); 7 a = b; 8 b = temp; 9 } 10 } 11 12 // 缺点:需要赋值大量的数据,但是有的时候并不要复制如此多的内容 13 class WidgetImpl { 14 public: 15 //... 16 private: 17 int a, b, c; 18

读书笔记_Effective_C++_条款十五:在资源类管理类中提供对原始资源的访问

void f(int* a) { cout <<* a << endl; } int main() { shared_ptr<int> p(new int(3)); f(p.get());//shared_ptr<int> 是无法隐式转换成int* ,但用.get()就可以把她转换回原始指针 }

读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针

int get_int(); void f(shared_ptr<int> a, int); //下面调用 f(new int(3), get_int());//如果是类而不是int就可以会有有explicit,就不能隐式转换 f(shared_ptr<int> a = new int(3), get_int());//还有显式转换 //然而都不是好方法 //从小老师就教导我们不同的编译器,调用参数顺序是不一样的 //在调用内存时,不要烦多写几句 //*****以独立语句将new产