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;
}