1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数。如下:

如果写下:

class Empty{ };

编译器就会实现以下代码:

class Empty{
Empty(){} //默认构造函数
Empty(const Empty& rhs ) {} //复制构造函数
~Empty() {} //析构函数
Empty& operator=( const Empty& rhs ) {} // 复制赋值操作符
};

编译器产生的是non-virtual函数。默认产生以上四种构造函数。

如果要使这些编译器默认产生的函数失效则提供了以下两种方法:

一. 将这些函数声明为private。如下:

class Empty{
public:
private:
Empty(const Empty& rhs ) {}
};

此时如果进行如下调用:

    Empty e1;
Empty e2(e1);
return ;

编译器就不会允许。但是这种情况在member函数或者friend函数内进行的时候就可以做到。

二. 为了能够保证所有的成员以及类不能够拷贝对象,需要定义以下类:

class Uncopyable{
protected:
Uncopyable() {}
~Uncopyable(){}
private:
Uncopyable( const Uncopyable& );
Uncopyable& operator=( const Uncopyable& );
};

然后使

class Empty:private Uncopyable{
.......
};

这样,当任何人(甚至是member函数或者friend函数)尝试拷贝Empty对象时,编译器试着生成一个copy构造函数和一个copy assignment操作符,而这些函数却尝试着调用base class对应的兄弟,此时编译器便拒绝操作。

2.

class NamedObject{
public:
NamedObject( const char* name, const T& value );
NamedObject( const string& name, const T& value ); private:
string nameValue;
T objectValue;
};
NamedObject<int> no1( "Smallest Prim Number",  );
NamedObject<int> no2(no1);

编译器已经为NamedObject类定义了copy构造函数,所以  NamedObject<int> no2(no1)  就调用了该copy构造函数。

3.

template< typename T >
class NamedObject{
public:
NamedObject( const string& name, const T& value ); private:
string& nameValue;
const T objectValue;
};
string newDog("persephone");
string oldDog("Satch");
NamedObject<int> p( newDog, );
NamedObject<int> s( oldDog, );
p = s;

c++不允许“让reference”指向不同的对象。如果打算在一个内含有“reference”成员的class内支持赋值操作,必须要定义一个copy assignment操作符。同样对于内含const的成员的类,更改const也是不合法的。

4. 如果某个base class将copy assignment声明为private,编译器也拒绝为其derived classes生成copy assignment操作符。因为编译器为derived classes生成的copy assignment操作符可以处理base class成分。

总结:编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符以及析构函数。

effective c++(05)(06)之c++默默编写并调用的函数的更多相关文章

  1. Effective C++条款05:了解C++默默编写并调用哪些函数

    class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operato ...

  2. 条款05:了解C++默默编写并调用哪些函数

    每一个class都会有一个或多个构造函数.一个析构函数.一个copy assignment操作符.这些控制着基础操作,像是产出新对象并确保它被初始化.摆脱旧对象并确保它被适当清理.以及赋予对象新值. ...

  3. 【05】了解C++默默编写并调用那些函数

    1.如果没有声明copy构造方法,copy赋值操作符,和析构方法,编译器会自动生成这些方法,且是inline. 2.如果没有声明任何构造方法,编译器会自动生成一个default构造方法,且是inlin ...

  4. Effective C++ 条款五 了解C++默默编写并调用哪些函数

      //申明一个类时,编译器会默认为你提供四个函数. //无参构造函数,析构函数,copy构造函数,copy assignment操作符.     template <typename T> ...

  5. Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5 ...

  6. EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

    5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...

  7. Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数

    一.如果用户没有提供构造函数.copy构造函数.copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来.编译器生成的这些函数都是public且inline ...

  8. Effective C++ -----条款05:了解C++默默编写并调用哪些函数

    面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符. 如果某个base classes将copy assignment ...

  9. [Effective C++ --005]了解C++默默编写并调用哪些函数

    <前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...

随机推荐

  1. idhttp.post方式 调用datasnap rest 远程方法

    idhttp.get方式调用,这种比较简单,大家都会.post方式网上却没有任何成功的代码,本人也是摸索了一个上午才搞定. 分享给大家. (1)post方式调用的远程方法,方法名必须加“update” ...

  2. msp430的两本书 电子版【worldsing笔记】

    msp430的两本书,pdf版 MSP430系列单片机接口_技术及系统设计实例 MSP430系列16位超低功耗单片机原理与应用 点击此处下载 ourdev_528863.pdf(文件大小:4.21M) ...

  3. Stones

    题目是:HDU1896 题目简述:输入一堆石头,每个石头有自己所在的位置p,以及自己可以抛多远的距离d.你每遇到第奇数个石头,就把石头丢出去,第偶数个石头就不管.计算出最后一个石头它所处的位置. 解法 ...

  4. 理解js中的原型链,prototype与__proto__的关系

    说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type="text/javascript"> 2 var Pers ...

  5. 10个Visual Studio原生开发调试技巧

    10个Visual Studio原生开发调试技巧(1) 2013-05-29 13:30 佚名 开源中国 我要评论(1) 字号:T | T 以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来 ...

  6. 获取windows版本信息

    procedure TForm1.Button1Click(Sender: TObject); Var     OSVI:OSVERSIONINFO; begin     OSVI.dwOSversi ...

  7. [安卓开发]App Widget开发入门指导

    本节所要讲的主要内容包括Android桌面小部件.App Widget的开发入门指导,并通过一个简单实例的形式来直观的讲解App Widget. 一.Widget .App Widget .Web A ...

  8. percona监控模板图形解释

    http://blog.itpub.net/28916011/viewspace-1971933/ percona监控mysql的几张图形解释     最近,我仔细研究了一下percona监控mysq ...

  9. java_jdbc_可滚动结果集与分页

    public static void create2(int i) { Connection conn = null; Statement st = null; ResultSet rs = null ...

  10. Android进阶笔记04:Android进程间通讯(IPC)之Messenger

    一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消 ...