构造、析构、赋值运算

一、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产生相应默认函数了

时间: 2024-10-09 22:32:29

构造、析构、赋值运算的相关文章

Effective C++笔记:构造/析构/赋值运算

条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函数时,编译器会给我们构造默认的. 当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数:当一个基类把它的拷贝赋值函数定义为private时,它的派生类也不无生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值. 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 将拷贝构

《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 条款09:绝不在构造和析构过程中调用virtual函数 你不该在构造和析构函数期间调用virtual函数,因为这样的调用不会带来你预期的结果. (1)在der

《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第8章 定制new和delete-读书笔记 条款05:了解C++默默编写并调用哪些函数 当C++处理过一个空类后,编译器就会为其声明(编译器版本的):一个拷贝构造函数.一个拷贝赋值运算符和一个析构函数.如果你没有声明任何构造函数,编译器还会声明一个默认构造函数.所有这些函数都被声明为pub

[Effective C++]构造/析构/赋值运算

条款05:了解C++默默编写了并调用了那些函数 请记住: 编译器可以暗自为class 创建default构造函数,copy构造函数,copy assignment 操作符,以及析构函数 class Empty { public: Empty(){...} //default constructor Empty(const Empty& rhs){...} //copy constructor ~Empty(){...} //destructor Empty& operator=(const

Effective C++ 笔记二 构造/析构/赋值运算

条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inline. 1 class Empty { 2 public: 3 Empty() {...} 4 Empty(const Empty& rhs) {...} 5 ~Empty() {...} 6 Empty& operator=(const Empty& rhs) {...} 7 }; 如

【Effective C++】构造/析构/赋值运算

条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函数时,编译器会给我们构造默认的. 当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数:当一个基类把它的拷贝赋值函数定义为private时,它的派生类也不无生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值. 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 将拷贝构

Effective C++ -- 构造析构赋值运算

05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自动生成copy assignment函数 基类将copy assignment操作符声明为private时,编译器拒绝为其derived classes生成一个copy assignment操作符. 06.若不想使用编译器自动生成的函数,就该明确拒绝 将自动生成的默认构造函数,拷贝构造函数,copy assignment声明为pr

Effective C++ 02构造/析构/赋值运算(待续)

条款05:了解C++默默编写并调用哪些函数 如果你自己没声明,编译器就会为类声明(编译器版本的)一个拷贝构造函数,一个拷贝赋值操作符和一个析构函数. 此外如果你没有声明任何构造函数,编译器也会成为你声明一个默认构造函数.所有这些函数都是public且inline. 惟有当这些函数被需要(被调用),它们才会被编译器创建出来.即有需求,编译器才会创建它们. 请记住: 编译器可以暗自为类创建默认构造函数.拷贝构造函数.拷贝赋值操作符,以及析构函数. 条款06:若不想使用编译器自动生成的函数,就该明确拒

Effective C++笔记(二):构造/析构/赋值运算

参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数(再次感觉原文翻译的实在是太啰嗦了!). 当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数:当一个基类把它的拷贝赋值函数定义为private时,它的派生类 也不能生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值. 条款06:若不想使用编译器自动生

Effective C++ —— 构造/析构/赋值运算(二)

条款05 : 了解C++默默编写并调用哪些函数 水电费 条款02 : 尽量以const,enum,inline 替换#define 水电费 条款02 : 尽量以const,enum,inline 替换#define 水电费 条款02 : 尽量以const,enum,inline 替换#define 水电费