首页 > 代码库 > 构造、析构、赋值运算

构造、析构、赋值运算

一、C++默默编写并调用了哪些函数

当你写下:

class CEmpty

{

}

这就好像你写下

class CEmpty

{

public:

      CEmpty(){…}

      CEmpty(const CEmpty &rhs){…}

      ~CEmpty(){…}

      CEmpty& operator=(const CEmpty &rhs){…}

}

这些C++默默编写的函数只有在被调用时才会被编译器创建(默认都是public),这里的拷贝

都是浅拷贝。如果你定义了构造函数,C++就不会为类创建一个默认构造函数(无参构造函数)。

如果你的泪没有申明copy构造函数,也没申明copy assignment操作符,编译器也会为它

创建那些函数(如果它们被调用的话)。但是如果你的class里面内含const成员或者reference

成员,C++会拒绝编译那一行赋值操作,因为C++不允许让reference该指向不同的对象,更改

const成员也是不合法的,此时你必须定义自己的copy assignment操作符。还有一种情况,如果

某个base classes 将copy assignment申明为private,编译器会拒绝为其derived classes生成一个

copy assignment(这个涉及到C++语言的对赋值的内部处理).

 

二、如不想使用编译器自动生成的函数,就该明确的拒绝

1、可以将构造、赋值操作符等申明为私有函数即可,不必实现。

这个还不是绝对安全,因为member函数和friend函数还是可以调用的。

不去定义它们的话,不慎调用它们就会获得一个连接错误。

2、设计一个专门为了阻止copying动作的base class

例如

class Cuncopyable

{

public:

Cuncopyable(){};

~Cuncopyable(){};

private:

Cuncopyable(cosnt Cuncopyable &);

Cuncopyable& operator=(const Cuncopyable &);

}

class A:private Cuncopyable

{

}

前面说了,这样就不会为derived class产生相应默认函数了

构造、析构、赋值运算