学习重载和拷贝构造函数的时候,遇到字符串拷贝和转换问题。对sting类有了一定的了解后,猜想了一下string类内部实现原理。就自己写了一个自己的string类。也没别的意思,就是里面有我在写这个类遇到的几个问题记录一下。希望以后少犯错误。
首先说说拷贝构造函数的问题。什么时候会调用拷贝构造函数呢?下面三种情况会导致调用拷贝构造函数,拷贝构造函数和构造函数一样,编译器默认会为你生成一个,假如你自己没有定义的话。并且自己定义了会覆盖编译器给你定义的。这个要记住,应为这个问题可能会给你带来一些困扰和不解。现在说说调用拷贝构造函数的三种情况。
1、函数参数按值传递,导致拷贝函数调用(按值传递相当于创建一个对象,然后复制给临时变量)
2、赋值操作
3、返回对象
拷贝构造函数的调用,会导致析构函数的调用。在我下面的代码里, friend istream& operator>>(istream& input, MyString& str);
这个函数里,没有MyString没有引用,导致析构函数调用多次。删除已经删除的指针,这个就很危险。
这是拷贝构造函数的问题,在传递参数的时候,如果数据量小的话就按值传递。如果数据量比较的话要用引用,一个是效率问题。另外可能导致多次析构的问题。上面提到定义自己的构造函数会覆盖编译器默认的构造函数,这样在我们使用过程中要是用到默认的不带参数的构造函数的话,就会发生编译错误。错误很明显,系统的构造函数被覆盖了。一定要注意。
在一个就是成员函数,非成员函数,友元函数之间的区别。成员函数可以定义成虚函数,而非成员函数不行。在定义类的过程中,定义尽量少的成员变量,和成员函数。因为任何东西到达一定量级之后,对于阅读者和维护者都是一件头疼的事情。在一个就是当非成员函数想访问类私有成员变量的时候就将函数定义为类的友元函数即可。在下面的代码里,为什么不把"<<",">>"这个两个符号的重载写成成员函数呢。写到成员函数里就会导致,这两种符号的重载都是用MyString类型为对象去调用这些方法。这样一个是看着不舒服,另一个也不符合大家使用std::cout和std::cin的习惯。c++还有很多很多挖掘的小细节,天行健,君子以自强不息。这就是要去追求的境界,相信有一天会悟到它的真谛。