第六章及其带有构造函数和析构函数的Stack

1.lei a;因为编译器已悄悄地在a的定义点处插入一个lei::lei的调用。就像其他成员函数被调用一样。传递到构造函数的第一个(秘密)参数是this指针,也就是调用这一函数的对象的地址,不过,对构造函数来说,this指针指向一个没有被初始化的内存块,构造函数的作用就是正确的初始化该内存块
3.在c++中,定义和初始化是集为一体的,不能只取其中之一
4.析构函数是在包括它的右括号处调用的
5.构造函数是通过正式的接口来强制初始化的
6.类的的初始化工作必须通过构造函数来完成
7.默认的构造函数非常重要,所以当且仅当在一个结构(struct或class)中没有构造函数时,编译器会自动为它创建一个(但它不会初始化内建类型),

8.安全性措施:

   用构造函数确保初始化(构造函数是通过正式的接口来强制初始化的)
   用析构函数确保清除

9.用表达式 sizeof c/sizeof *c获取数组的大小



#include "C06 Nojump.h"  
X::X(){}  
void f(int i)  
{  
    X x1;//将x1放在if之后会可能直接的跳过。所以必须放在函数头  
    if (i<10)  
    {  
        goto jump1;//当i>=10时,这条语句会跳过,于是出现jump1会初始化  
    }  
jump1:  
    switch(i)  
    {  
    case  1://这里若没有{},会出现x2的初始操作跳过由“case”标签跳过的错误。所以应该加上括弧  
        {  
            X x2;  
            break;  
        }  
    case 2:  
        {  
            X x3;  
            break;  
        }  
    }  
}  
int main()  
{  
    f(9);  
    f(11);  
}  


///

//带有构造函数和析构函数的Stack
mystack类仅仅是用来操作link对象的
//为了更隐蔽可以
//struct link;
//struct link*head;
//同时link里面又有data数据空间,要delete的
///
//c.06mystack.h
#ifndef STACK_H
#define STACK_H
class mystack
{
	struct link
	{
		void *data;
		link *next;
		link(void *dat,link *nxt);
		~link();
	}*head;/head指针是stack的成员
public:
	mystack();
	~mystack();
	void push(void *dat);//把数据放入stack
	void* peek();//获取头数据指针
	void* pop();//获取头数据指针并且delete此数据空间
};
#endif
///
//cpp
#include "mystack.h"
#include <cstdlib>
#include <cassert>
mystack::link::link(void *dat,link *nxt)//类link的构造函数
{
	data=dat;
	next=nxt;
}
mystack::link::~link(){}

mystack::mystack(){head=NULL;}//类stack的构造函数
void mystack::push(void *dat)
{
	head=new link(dat,head);完美
}

void* mystack::peek()
{
	assert(head != 0);
	return head->data;
}
void* mystack::pop()
{
	if(head==0)return 0;
	void *result=head->data;
	link* oldhead=head;
	head=head->next;
	delete oldhead;//delete类link空间
	return result;
}
mystack::~mystack()
{
	assert(head==0);
}
///
//usecpp
#include "mystack.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
	mystack textlines;
	textlines.push(new string("first") );
	textlines.push(new string("secong") );
	textlines.push(new string("third") );
string *s;
s=(string*)textlines.peek();
cout<<*s<<endl;

while((s=(string*)textlines.pop() ) !=0 )
{
	cout<<*s<<endl;
	delete s;//delete 数据data的空进啊
}
 		
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫云的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值