Write in advance
需要实现一个类,提供函数的定义,并写一个函数测试。因为private中存在一个char* 指针,需动态分配内存,在虚函数中释放,以免造成内存泄漏。
因为private中存在指针,需要深拷贝,copy constructor需要拷贝指针所指向空间的内容,而不是拷贝指向。operator= 需要释放之前指向的内存空间,重新申请,重新赋值。注意 operator= 需做自赋值的检查。
在main函数中,我使用了一个类的数组,一个指针数组——相对于其他部分,这两个数组花了我不少时间。
第一种方法,类的数值,当数值创建时,数组中的所有成员都已经通过default constructor 初始化,因此尝试创建数组,再逐个初始化行不通。为了给数组中各个元素重新赋值,只能使用temp object。——但是这样效率低下。考虑一下,我们用构造函数初始化一个对象A,使用assignment constructor将它的值赋给另一个对象B,最后使用destructor销毁对象A。如此循环五次。而且创建数组时各个元素也都使用了constructor。
再来考虑第二种方法。使用一个指针数组,在循环中给每个指针元素初始化,传入参数,将对象设置为期望的值,没有temporary object,没有assignment constructor。简洁明了。需要的是对指针的熟悉和思考。
Concrete implementaion
此处给出代码。
head file
#ifndef COW_H_
#define COW_H_
class cow {
const static int Max = 20;
char name[Max];
char* hobby;
double weight;
public:
cow();
cow(const char* nm, const char* ho, double wt);
cow(const cow& c); //copy constructor
~cow();
cow& operator=(const cow& c);
void showcow() const;
};
#endif
method file
#include"cow.h"
#include<iostream>
cow::cow()
{
strncpy(name, "C++",Max);
name[Max - 1] = 0;
hobby = new char[strlen("study") + 1];
strcpy(hobby, "study");
weight = 0.0;
}
cow::cow(const char* nm, const char* ho, double wt)
{
strncpy(name, nm,Max);
name[Max - 1] = 0;
hobby = new char[strlen(ho) + 1];
strcpy(hobby, ho);
weight = wt;
}
cow::cow(const cow& co)
{
strncpy(name, co.name,Max);
name[Max - 1] = '\0';
hobby = new char[strlen(co.hobby) + 1];
strcpy(hobby, co.hobby);
weight = co.weight;
}
cow::~cow()
{
delete[] hobby;
}
cow& cow::operator=(const cow& c)
{
if (&c == this)
return *this;
strncpy(name, c.name,Max);
name[Max - 1] = '\0';
delete[] hobby;
hobby = new char[strlen(c.hobby) + 1];
strcpy(hobby, c.hobby);
weight = c.weight;
return *this;
}
void cow::showcow() const
{
std::cout << "name:\"" << name << "\", " << "hobby:"
<< hobby << ", weight " << weight << std::endl;
return;
}
test file
#include"cow.h"
#include<iostream>
#define _USE_MATH_DEFINES
#include<math.h>
int main()
{
const int Arr_Size = 5;
const float pi = 3.14;
const char* names[] = { "Joe","Kafka","Gatsby","Larry","Trump"};
const char* hobby[] = {"basket","badmin","foot","riding","run"};
cow obj1;
obj1.showcow();
cow cow_array[Arr_Size];
cow* cow_pt[Arr_Size];
for (int i = 0; i < Arr_Size; i++)
{
cow_pt[i] = new cow(names[i], hobby[i], (i + 1) * M_PI);
}
std::cout << "see a loop\n";
for (int i = 0; i < Arr_Size; i++)
{
cow_array[i] = cow(names[i], hobby[i], (i + 1)* M_PI); // create temporary object,assign value and expire
}
for (int i = 0; i < Arr_Size; i++)
{
cow_array[i].showcow();
cow_pt[i]->showcow();
}
std::cout << "\nAll cows have been initialized and displayed.\n";
cow obj2(cow_array[2]);
obj2.showcow();
obj2 = *cow_pt[4];// **(cow_pt + 4);
obj2.showcow();
cow obj3(obj2); //invoke copy constructor
obj3.showcow();
return 0;
}
Conclusion
此次练习,除了复习常见的构造函数,就是留意动态分配内存时copy constructor 与 assignment constructor 以及destructor 的内容。
main函数中的指针数组我用的不多,有些生疏,花了些时间。此外, test file中使用了宏,点名使用<math.h>文件中的M_PI。这是使用非C++标准的一个例子,以后也许会回来看看,作为参考。