首页 > 代码库 > 构造、析构、赋值运算
构造、析构、赋值运算
一、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产生相应默认函数了
构造、析构、赋值运算