您的位置:首页 > 编程语言 > C语言/C++

我的C++ primer plus第4章作业总结

2015-08-31 23:52 323 查看
1.在类里面声明数组要先在构造函数里创建一个临时数组(这个数组一定要是static类型的,否则在执行完构造函数,这个临时数组的空间会被释放,后面指向它的指针会指向空地址),保存要保存的变量到各个元素里,然后在类的头文件里声明同类型的指针数组,在构造函数里用这个指针 = 刚刚临时数组。

例子:

    如果我们希望实现unsigned int array[20]={1,2,3};的功能,则可以改变此类的定义如下:

    class exp

{ public:

     exp();

     ~exp();

     unsigned int *array;

};

    然后在结构函数exp()中定义:

    static unsigned int tmp[20]={1,2,3};

    array=tmp;

    注意这里必须要用static,否则在exp()函数执行完毕后,tmp[]数组的空间会被释放,array所指向的地址中存放的数组会显示为空。

    这样就可以在其它位置对array的初始值进行访问了。
以上方法是使用在类里面的数组变量需要初始化一段特定字符串的时候才需要采用的方法。一般不需要初始化的,只需要清零或者只是一个特定字符的只需要memset那个数组就可以了,不需要先定义指针,然后再使用中间变量,再把指针指向这个中间变量那么麻烦。

2.cin.getline(*str, 字符数N); 实际只能接受字符数N-1字符,如果N是5,只能接受str里面的前4个字符,N是20,只能接收str里面的前19个字符(总是会把第N个字符替换成'(\0')。

3.当我们在使用#include预处理应用的时候,C++的头文件一般是不带有.h后缀的,所以一定要加上using namespace std;命名空间才行。

4.结构体的初始化(也可用于类)

typedef struct inflatable

{
string Name;
char *NickName;
float fVolume;
double dPrice;

}INF, *INFNODE;

//结构体的初始化

INF Host;
memset(&Host, 0, sizeof(Host));
Host.NickName
= new char;
//初始化char指针
Host.Name
= "SuJun";
Host.NickName
= "ahl";
Host.fVolume
= 1.88;
Host.dPrice
= 29.99;

//结构体指针的初始化

INFNODE Guest;
Guest = new inflatable;//初始化结构体指针使用new,否则是野指针没什么用,运行时候会出问题
Guest->NickName = new char; //初始化char指针
Guest->Name
= "LiJunyan";
Guest->NickName="Fish";
Guest->fVolume=3.12;
Guest->dPrice
= 32.99;

5.++的优先级比取地址符号*的优先级要高

6.指针用武之地在于,可以在运行阶段分配未命名的内存赋值,所以这样的情况下只能通过指针访问。

7.一个人在什么情况下就会自然而然的想到用new呢?

(1).new只是为了怕它自动被释放掉了而已呀,不会自动释放掉变量,尤其是在类里面(这也就为什么我们会故意在类里面new char[MAX_PATH]一个字符串指针的意思,而不直接char chTemp[MAX_PATH]的意义所在。

(2).分配数据的大小的时候:

当我们需要初始化一个未知的类型或者类,这个东西在编译的时候我们并不知道它的具体大小,所以我们没有办法去开辟一个具体指针去分配给它,所以我们就可以用到new,new (类名),当运行的时候,编译器才会自动帮我们计算出这个类到底该有多大。需要多大的内存,这样我们new出来,就正好把这段内存分配给它,不多也不少,刚刚好。

为了保存340282366920938463463374607431768211456这个数字

我数学不好,根本就不知道这玩意到底多大,用多少个字节才能保存它,可是我知道好像C++里面最大的保存整数类型就是unsigned longlong所以我为了能保存这个让我头疼的东西,我要这么干!

unsigned longlong* pt = new (unsigned longlong);//(指针类型要和内存类型一致,否则会有编译错误)

*pt = 340282366920938463463374607431768211456;

然后我就存下它了

就好像买菜一样,去菜市场,我要买多少菜,应该拿多大的塑料袋我根本就不知道(编译阶段),不过我到了菜市场(运行阶段)挑中了2个西红柿,卖菜的除了给了我两个西红柿还给了我一个比较小的塑料袋,刚刚好能装的下。然后我又买了一整个南瓜,卖菜的又给了我一个非常大的塑料袋,刚刚好能装的下那个大南瓜,我或许可以把这个大南瓜拿回家做万圣节的头套呢,也许,不过我庆幸我有有个非常大的塑料袋可以装它,这就不用我两只手来抱着它回家了实在太方便了。

同理new一个类只不过就像你在超市里一样,你拿了一整个购物车的东西,他们就是一个类,到结账的时候,收银员不会让你把那个购物车带走的,他们只好给你一个刚好装的下你这么多东西的一个大的纸袋而已!这个大纸袋就是new出来的,非常的贴心,不多不少刚刚好。

当然我们用完这个塑料袋得丢到垃圾桶里去,否则放在家里会占用我们的空间,所以我们要delete掉它:

delete pt;

完整步骤就是:

unsigned longlong* pt = new (unsigned longlong);

*pt = 340282366920938463463374607431768211456;

delete pt;

8.
9c06
关于delete:

delete 只有两种情况会崩:

一种是之前已经释放过了

二是new的东西和delete的不一致

所以当我们在一个类里面比如:"CPublic.h"里面

class CPublic

{

public:
CPublic(void);
~CPublic(void);

string sName;
char *chNickName;
int iAge;
double dProperty;
void input();
void show();

};

在"CPublic.cpp"里面是这样初始化chNickName

CPublic::CPublic(void)

{
sName = "";
chNickName = new char[MAX_PATH];
//不能是new char因为chNickName我们具体用途是一个字符串,
//不是一个字所以不能用char因为char只能存一个字符。我们要存一个字符串,类型要一样。
//输入了字符串以后在后面delete chNickName的时候会出现堆栈错误。
iAge = 0;
dProperty = 0.0;

}

//delete的位置

CPublic::~CPublic(void)

{
delete chNickName;
cout << "your nickname is nothing." << endl;

}

9.关于用new初始化一个类数组

声明变量类的"Candy.h":

class CCandy

{

public:
CCandy(void);
~CCandy(void);
string sName;
float fWeight;
int iEnergy;

};

处理过程类的的"Deal.h"

class CDeal

{

public:
CDeal(void);
~CDeal(void);
CCandyBar* snack;
//3个类数组
void Deal();

};

处理过程类的的"Deal.cpp"

CDeal::CDeal(void)

{
snack = new CCandyBar[3];
//这个地方new出3个snack数组
//初始化赋值例子
snack[0].sName = "A";
snack[0].fWeight = 20.5;
snack[0].iEnergy = 60;
snack[1].sName = "B";
snack[1].fWeight = 21.5;
snack[1].iEnergy = 61;
snack[2].sName = "C";
snack[2].fWeight = 22.5;
snack[2].iEnergy = 62;

}

//delete方式

CDeal::~CDeal(void)

{
delete []snack;
//要delete数组,要用这样的格式!
cout << "bye, candy" << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cpp