C++ Primer Plus v6 Chapter 12 exercise 1

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++标准的一个例子,以后也许会回来看看,作为参考。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值