我的C++ primer plus第4章作业总结
来源:互联网 发布:js nextsibling 编辑:程序博客网 时间:2024/06/06 19:45
1.在类里面声明数组要先在构造函数里创建一个临时数组(这个数组一定要是static类型的,否则在执行完构造函数,这个临时数组的空间会被释放,后面指向它的指针会指向空地址),保存要保存的变量到各个元素里,然后在类的头文件里声明同类型的指针数组,在构造函数里用这个指针 = 刚刚临时数组。
例子:
{ public:
};
以上方法是使用在类里面的数组变量需要初始化一段特定字符串的时候才需要采用的方法。一般不需要初始化的,只需要清零或者只是一个特定字符的只需要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.关于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;
}
- 我的C++ primer plus第4章作业总结
- 我的C++ primer plus第3章作业总结
- 我的C++ primer plus第5章作业总结
- c primer plus第3章总结:数据类型
- c primer plus第6章总结:循环
- c primer plus第7章总结:分支跳转
- c primer plus第8章总结:字符输入输出
- c primer plus第9章总结:函数
- c primer plus第10章总结:数组和指针
- c primer plus第13章总结:文件输入/输出
- c primer plus第15章总结:位操作
- C primer plus 第5.6.7章总结
- c primer plus第4章总结:字符串和格式化输入输出
- C++primer plus第4-6章笔记
- c++primer plus 第4章编程练习之路
- c primer plus第14章习题
- c++primer plus 第12章习题
- c primer plus第16章总结:C预处理器和C库
- OBS【视频+图文】使用教程
- Binary Tree Zigzag Level Order Traversal
- Linux学习笔记----Linux 系统管理----系统定时任务
- 微软笔试题 HihoCoder#1136: Professor Q's Software 题解
- C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
- 我的C++ primer plus第4章作业总结
- 二维数组的合并为有序的一维数组
- 从数据看微创软件和BAT三个大公司的员工身价差距
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记45 Embed Segues
- servlet中doPost()和doGet()
- 程序员面试中常见10大算法汇总
- bzoj1721 [Usaco2006 Mar]Ski Lift 缆车支柱(dp)
- Java二叉排序树
- iOS URI跳转方式地图导航的代码实践