zoukankan      html  css  js  c++  java
  • effective c++(05)(06)之c++默默编写并调用的函数

    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 0;

    编译器就不会允许。但是这种情况在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", 2 );
    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, 2 );
    NamedObject<int> s( oldDog, 36 );
    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操作符以及析构函数。

  • 相关阅读:
    链接的热键属性accesskey
    链接目标属性
    HTML添加多媒体或音乐
    HTML中的图像
    DreamweaverCS6
    HTML其他基本格式说明
    HTML页面主体常用设置
    网页设计与开发的过程
    文字排版
    选择器
  • 原文地址:https://www.cnblogs.com/2011winseu/p/3184909.html
Copyright © 2011-2022 走看看