美文网首页
GeekBand C++面向对象高级编程(上)(第二周):拾遗

GeekBand C++面向对象高级编程(上)(第二周):拾遗

作者: 七七的面包在流浪 | 来源:发表于2016-03-05 16:09 被阅读0次

    本周主要记录一些零散的知识点

    1.拷贝构造函数#

    带指针的类用户编写自己的拷贝构造函数:
    原因:编译器默认的拷贝构造函数是按照bit by bit 的模式进行的,如果成员变量中含有指针,那么两个类中的指针成员变量将会指向同一块内存地址。如果其中一个类将那块内存释放,将会影响到另一个类,即另一个类指针指向的地址已经失效。

    2.拷贝赋值函数#

    带指针的类用户编写自己的拷贝赋值函数
    原因:理由同上。

    3.拷贝赋值函数的自我赋值检查#

    Demo_0

    MyClass s1;
    ...
    s1 =s1;
    

    像Demo_0中那样s1 =s1,无意是一件非常蠢的事,虽然我们一般不会去做,但是谁知道呢。为了要防备这种情况的发生,可以采取这样的做法:
    Demo_1

    if(this == & str)
        return *this;
    

    这是一个不错的做法,但其实《Effective C++》 一书中还介绍了其他的方法,书不在身边,以后补。

    4.何时使用引用#

    返回值不是local object 就可以传reference

    5.static#

    • 在类中,可以定义static 成员数据(变量,常量),也可以定义static成员函数。
    • static成员数据在内存中只有一份,它不属于该类的任何一个实例,它先于类的实例化而存在。
    • static成员函数用来处理static成员数据

    6.仅此一份#

    • 上面说到static成员数据在内存中仅此一份,其实不仅如此,类的成员函数也是如此,在内存中只有一份。所以现在明白了,为什么计算类的大小时,从未计算过成员函数了吧。
    • 另外,既然成员函数在内存中仅有一份,同一个类的不同实例是如何调用成员函数的呢?看下面实例:
      Demo_2
    class myclass
    {
    public:
        void func();  
    };
    ...
    myclass m1;
    myclass m2;
    ...
    //when  calling func(),we use it in the follow form;
    m1.func();
    m2.func();
    //Absolutely,it equals to what I show next;
    func(&m1);
    func(&m2);
    

    也就是说,不同类调用成员函数时,是将类的地址作为引用传给了函数。(如果不能理解第二种写法,可以参考操作符重载的成员数写法)

    暂时到此为止

    相关文章

      网友评论

          本文标题:GeekBand C++面向对象高级编程(上)(第二周):拾遗

          本文链接:https://www.haomeiwen.com/subject/mxtakttx.html