重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

C++Primer13.1.3节练习-创新互联

练习13.9:

创新互联凭借在网站建设、网站推广领域领先的技术能力和多年的行业经验,为客户提供超值的营销型网站建设服务,我们始终认为:好的营销型网站就是好的业务员。我们已成功为企业单位、个人等客户提供了成都做网站、网站设计服务,以良好的商业信誉,完善的服务及深厚的技术力量处于同行领先地位。

析构函数执行与构造函数相反的操作:构造函数初始化对象的非static数据成员,还可能做一些其他工作;析构函数释放对象使用的资源,并销毁对象的非static数据成员

析构函数是类的成员函数,名字由波浪线接类名构成,它没有返回值,不接受参数

类似拷贝构造函数和拷贝赋值运算符,对于某些类,合成析构函数用来阻止该类型的对象被销毁,如果不是这种情况,合成析构函数的函数体就为空

当一个类未定义自己的析构函数时,编译器会为它定义一个合成析构函数

练习13.10:

StrBlob类和StrBlobPtr类没有定义析构函数,编译器会为这两个类定义合成析构函数。

StrBlob对象销毁时,在合成析构函数的空函数体执行完毕后,会进行隐含析构阶段,此时会将数据成员data销毁,调用shared_ptr的析构函数。引用计数减1,减为0后释放内存

StrBlobPtr对象销毁时,在合成析构函数的空函数体执行完毕后,会进行隐含析构阶段,此时会将数据成员wptr和curr销毁,调用weak_ptr的析构函数销毁wptr。引用计数不变,curr是内置数据类型,直接销毁

练习13.11:

#include#includeusing namespace std;

class HasPtr
{
public:
	HasPtr(const std::string& s = std::string()):
		ps(new std::string(s)),i(0) { }
	//拷贝构造函数
	HasPtr(const HasPtr& hp): ps(new std::string(*hp.ps)),i(hp.i) { }
	//拷贝赋值运算符
	HasPtr& operator=(const HasPtr&);
	//析构函数
	~HasPtr() { }

private:
	std::string* ps;
	int i;
};

HasPtr& HasPtr::operator=(const HasPtr& ptr)
{
	delete ps;
	ps = new string(*ptr.ps);
	i = ptr.i;
	return *this;
}

练习13.12:

会发生三次析构操作

函数执行结束时,临时变量item1和item2被销毁,执行析构函数

函数结束后,非引用形参accum被销毁,执行析构函数

练习13.13:

#include#includeusing namespace std;
#includeclass HasPtr
{
public:
	HasPtr(const std::string& s = std::string()):
		ps(new std::string(s)),i(0) { }
	//拷贝构造函数
	HasPtr(const HasPtr& hp): ps(new std::string(*hp.ps)),i(hp.i) { }
	//拷贝赋值运算符
	HasPtr& operator=(const HasPtr&);
	//析构函数
	~HasPtr() { }

private:
	std::string* ps;
	int i;
};

HasPtr& HasPtr::operator=(const HasPtr& ptr)
{
	delete ps;
	ps = new string(*ptr.ps);
	i = ptr.i;
	return *this;
}

struct X {
	//默认构造
	X() { std::cout<< "X()"<< std::endl; }
	//拷贝构造
	X(const X&) { std::cout<< "X(const X&)"<< std::endl; }
	//拷贝赋值运算符
	X& operator=(const X& x)
	{
		std::cout<< "X& operator=(const X& x)"<< std::endl;
		return *this;
	}
	//析构函数
	~X() { std::cout<< "~X()"<< std::endl; }
};

void func(X x)
{

}


int main()
{
	//创建X对象
	X x;
	//非引用参数传递
	func(x);
	//引用参数传递
	X x1(x);
	//动态分配
	X* x2 = new X;
	//存放于容器
	vectorv;
	v.push_back(x);

	system("pause");
	return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:C++Primer13.1.3节练习-创新互联
网页URL:http://cqcxhl.cn/article/gooie.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP