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

2016-03-05  本文已影响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);

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

暂时到此为止

上一篇下一篇

猜你喜欢

热点阅读