本周主要记录一些零散的知识点
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);
也就是说,不同类调用成员函数时,是将类的地址作为引用传给了函数。(如果不能理解第二种写法,可以参考操作符重载的成员数写法)
暂时到此为止
网友评论