第九周项目—理解深复制



(1)阅读下面的程序,补足未完成的注释

#include <iostream>
#include <cstring>
using namespace std;
class A
{
private:
    char *a;
public:
    A(char *aa)
    {
        a=new char[strlen(aa)+1];
        strcpy(a,aa);
    }
    ~A()
    {
        delete []a;
    }
    void output()
    {
        cout<<a<<endl;
    }
};
int main()
{
    A a("good morning,code monkeys!");
    a.output();
    return 0;
}

运行结果:

(2)将注释(a)所在的那一行去掉,会出现什么现象?为什么?

会崩掉,因为没有给指针类型的a分配所指向的空间。

(2)为什么a数据成员所占用的存储空间要在aa长度基础上加1?若指针a不是指向字符(即不作为字符串的地址),是否有必要加1?

因为在字符串的末尾有空字符‘\0’,需要在原来的长度上加1。没有必要。

(3)为类A增加复制构造函数:

#include <iostream>
#include <cstring>
using namespace std;
class A
{
private:
    char *a;
public:
    A(char *aa)
    {
        a=new char[strlen(aa)+1];
        strcpy(a,aa);
    }
    A(A &b)
    {
        a=new char[strlen(b.a)+1];
        strcpy(a,b.a);
    }
    ~A()
    {
        delete []a;
    }
    void output()
    {
        cout<<a<<endl;
    }
};
int main()
{
    A a("good morning,code monkeys!");
    a.output();
    A b(a);
    b.output();
    return 0;
}

运行结果:

心得体会:

在使用strlen函数数计算字符串长度时不要忘记加1,这样分配的空间才能跟aa相等。

Sizeof与Strlen的区别与联系(转)

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned
int类型。

该类型保证能容纳实现所建立的最大对象的字节大小。

2.sizeof是算符,strlen是函数。

3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以‘‘\0‘‘结尾的。

sizeof还可以用函数做参数,比如:

short f();

printf("%d\n", sizeof(f()));

输出的结果是sizeof(short),即2。

4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。

5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,

当适用一静态地空间数组, sizeof 归还全部数组的尺寸。

sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,

如:

fun(char [8])

fun(char [])

都等价于 fun(char *)

在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小

如果想在函数内知道数组的大小, 需要这样做:

进入函数后用memcpy拷贝出来,长度由另一个形参传进去

fun(unsiged char *p1, int len)

{

unsigned char* buf = new unsigned char[len+1]

memcpy(buf, p1, len);

}

我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度

看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:

char str[20]="0123456789";

int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。

int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。

上面是对静态数组处理的结果,如果是对指针,结果就不一样了

char* ss = "0123456789";

sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof
获得的是一个指针的之所占的空间,应该是

长整型的,所以是4

sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位‘0‘ 所占的内存空间,是char类

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen

时间: 2024-10-13 13:53:47

第九周项目—理解深复制的相关文章

第九周项目1—深复制体验(1)

问题及代码: /* *Copyright(c) 2016.烟台大学计算机与控制工程学院 *ALL rights reserved. *文件名称:main.cpp *作者:郝昱猛 *完成日期:2016年5月10日 *问题描述: 深复制体验 */ #include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = new char[

第九周项目1—深复制体验(2)

问题及代码: /* *Copyright(c) 2016.烟台大学计算机与控制工程学院 *ALL rights reserved. *文件名称:main.cpp *作者:郝昱猛 *完成日期:2016年5月10日 *问题描述:深复制体验,增加复制构造函数 */ #include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = n

第九周 项目一深复制体验(1)(2)

问题及代码: /*Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:贾庆严 *完成日期:2016年5月10日 *版 本 号:v1.0 *问题描述:阅读程序,写出程序的运行结果并理解,补充注释. */ #include<iostream> #include<cstring> using namespace std; class A { private: char *a; public:

第六周 项目一-深复制体验(2)(3)

问题 (2)将注释(a)所在的那一行去掉,会出现什么现象?为什么?为什么a数据成员所占用的存储空间要在aa长度基础上加1?若指针a不是指向字符(即不作为字符串的地址),是否有必要加1? 提示错误,因为没有为a指针初始化地址,a将变为野指针. 字符串结束时需要用'\0'. 没有必要. (3)为类A增加复制构造函数,用下面的main函数测试 int main() { A a("good morning, code monkeys!"); a.output(); A b(a); b.outp

第六周项目一—深复制体验(2)

(3)为类A增加复制构造函数,用下面的main函数测试 int main() { A a("good morning, code monkeys!"); a.output(); A b(a); b.output(); return 0; } 参考解答: /* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 4 月 14 日 * 版 本 号:v1.0 */

第六周 项目一-深复制体验(1)

#include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = new char[strlen(aa)+1]; //(a)这样处理的意义在于:为aa指针开辟出空间 strcpy(a, aa); //(b)数据成员a与形式参数aa的关系:将a指针所指向地址复制给aa指针 } ~A() { delete []a; //(c)这样

第六周 项目阅读-深复制、友元、类模板(2)

代码 #include <iostream> using namespace std; class MyClass { public: MyClass(int x=0):i(x) { cout<<"C"<<i; } ~MyClass() { cout<<"D"<<i; } void SetValue(int val) { i=val; } int GetVal() { return i; } private

第六周项目一-深复制的体验

#include<iostream> #include<cstring> using namespace std; class A { private: char *a; public: A(char *aa) { a = new char[strlen(aa)+1]; strcpy(a,aa); } A(A &b) { a = new char[strlen(b.a)+1]; strcpy(a,b.a); } ~A() { delete []a; } void outpu

第九周 项目二-我的数组类

/*Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:肖雪 *完成日期:2016年5月9日 *版 本 号:v1.0 *问题描述:阅读程序,请完成成员函数的定义,因为存在指针型的数据成员,注意需要深复制的构造函数 */ #include<iostream> using namespace std; class MyArray { private: int *arrayAddr; //保存一个有le