C++ 深入理解系列-构造函数的技巧

Posted 哇小明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 深入理解系列-构造函数的技巧相关的知识,希望对你有一定的参考价值。

**

引言

**
有时候我们会不希望当前类被复制,因为有可能类中的成员不建议被复制比如锁,一些智能引数等,这个时候想到的办法就是禁止类中拷贝构造函数和重载操作符=这两个成员函数的禁用了,有以下两种方法可以解决这个问题。

用delete关键字

// c++ 11以上均可用
class TestDeleteCopy

public:
    TestDeleteCopy(int count): m_count(count) 
public:
    TestDeleteCopy(const TestDeleteCopy&) = delete;
    TestDeleteCopy& operator=(const TestDeleteCopy&) = delete;

private:
    int m_count;
    pthread_mutex_t m_Mutex;
;

以上用delete关键字将两个具有拷贝功能的函数给屏蔽了。

函数私有化

// 任何版本均可用
class TestPrivateCopy

public:
    TestPrivateCopy(int count): m_count(count) 
private:
    TestPrivateCopy(const TestPrivateCopy&);
    TestPrivateCopy& operator=(const TestPrivateCopy&);

private:
    int m_count;
    pthread_mutex_t m_Mutex;
;

私有化这两个函数,外部是无法成功调用的。

通常的c++类:

class TestCopyConstructor

public:
    TestCopyConstructor(int count): m_count(count) 
public:
    TestCopyConstructor(const TestCopyConstructor& other)
        this->m_count = other.m_count;
        std::cout<<"copy constructor called!"<<std::end;
    
    TestCopyConstructor& operator=(const TestCopyConstructor&other)
        this->m_count = other.m_count;
        std::cout<<"operator = called!"std::end;
        return *this;
    

private:
    int m_count;
    //pthread_mutex_t m_Mutex;
;

测试拷贝过程的调用过程:

TestCopyConstructor a(1);

TestCopyConstructor b = a;//copy constructor called!

b=a;//operator = called!

TestCopyConstructor c(a);//copy constructor called!

这说明声明一个新的类变量的时候赋值其实是拷贝构造函数在生效。

以上是关于C++ 深入理解系列-构造函数的技巧的主要内容,如果未能解决你的问题,请参考以下文章

javascript中函数的5个高级技巧

深入理解JavaScript系列(26):设计模式之构造函数模式

稍微深入点理解C++复制控制转

C++深入理解系列-类对象的限制

深入理解C++中的explicitkeyword

深入理解C++类和对象(中)