首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

生手交作业:C++ PRIMER 中文第四版 习题13.4

2012-12-23 
新手交作业:C++ PRIMER 中文第四版 习题13.4习题13.4:对于如下的类的简单定义,编写一个复制构造函数复制所

新手交作业:C++ PRIMER 中文第四版 习题13.4
习题13.4:
对于如下的类的简单定义,编写一个复制构造函数复制所有成员。复制pstring指向的对象而不是复制指针。
struct NoName {
    NoName(): pstring(new std::string), i(0), d(0) {}
private:
    std::string *pstring;
    int     i;
    double  d;
};

1、NoName头文件:


#include <string>

#ifndef NoNameH
#define NoNameH

struct NoName
{
NoName():pstring(new std::string), i(0), d(0) {}
        //自己添加构造函数方便测试
NoName(const std::string&, int, double);
NoName(const NoName &is);
        //自己添加的3个用于测试数据的简单函数
int geti() const;
double getd() const;
std::string gets() const;
private:
std::string *pstring;
int i;
double d;
};

#endif


2、NoName类相关函数的具体定义

#include "NoName.h"
#include <string>

NoName::NoName(const NoName &is):
//复制pstring指针指向的对象,而不复制指针
pstring(new std::string(*is.pstring)), i(is.i), d(is.d) {}

double NoName::getd() const
{ return d; }

int NoName::geti() const
{ return i; }

std::string NoName::gets() const
{ return *pstring; }

NoName::NoName(const std::string &str, int ival, double dval):
pstring(new std::string(str)), i(ival), d(dval) {}


3、main文件,执行测试的具体代码

#include "NoName.h"
#include <iostream>
using namespace std;

int main()
{
NoName test("I am Aka!", 31, 1.63 );
NoName now(test);
//测试now是否成功复制数据
cout << now.gets() << endl
<< now.geti() << endl
<< now.getd() << endl;
return 0;
}



以上自己在VS2010中调试通过,请各位C++前辈们批评指教,谢谢。
[最优解释]
顶楼主, 大家一起学习
[其他解释]
对楼主表示敬佩。另外请问楼主现在从事的是程序员的工作吗?
[其他解释]
引用:
对了,有一个问题,题目是让我复制所有成员,那我是否要改成赋值操作符的形式才符合题目要求,目前我是显示直接初始化的方式。是否该更改成以下形式:

C/C++ code?123456NoName::NoName(const NoName &amp;is){    pstring = new std::string(*is.pstring);    i = is.i;   ……



举个例子吧。
int a=5;
int b=7;

变量a有一个有一个地址,地址里面的值是5; 变量b也有一个地址,地址里面的值是7;
当我做 a=b;这个操作的时候,其实是修改a地址里面的值为b的值(不是地址)。这是赋值操作

int *a;
int b = 7;
当 a = &b; 这个是让a指向b的地址(不是值)。 这个是拷贝操作。

这是我的理解了 不知道正确与否 ,各大虾轻点
[其他解释]
引用:
对了,有一个问题,题目是让我复制所有成员,那我是否要改成赋值操作符的形式才符合题目要求,目前我是显示直接初始化的方式。是否该更改成以下形式:

C/C++ code?123456NoName::NoName(const NoName &amp;is){    pstring = new std::string(*is.pstring);    i = is.i;   ……

个人觉得,成员变量初始化直接用初始化列表比较好,用赋值的方式效率会下降,而且复制跟是否是赋值的形式没有任何关系
[其他解释]
尽管过年后就要32岁了,尽管我是今年4月开始接触编程,尽管我是10月份开始接触C++编程,但是,C++编程的学习给我带来了无比的快乐和成就感——虽然这种成就只是小儿科。
[其他解释]
对了,有一个问题,题目是让我复制所有成员,那我是否要改成赋值操作符的形式才符合题目要求,目前我是显示直接初始化的方式。是否该更改成以下形式:


NoName::NoName(const NoName &is)
{
    pstring = new std::string(*is.pstring);
    i = is.i;
    d = is.d;
}

[其他解释]
不是有答案,自己写好了,对着答案看看哪里不足。
[其他解释]
引用:
不是有答案,自己写好了,对着答案看看哪里不足。


我手头没有答案,都只能根据调试来验证的。
[其他解释]
引用:
对楼主表示敬佩。另外请问楼主现在从事的是程序员的工作吗?


现在的工作跟程序员工作一点边也沾不上,我是从事法律工作的。

热点排行