0.C++ 对 C 的增强,表现在六个方面:
增强了类型检查机制
增加了面向对象的机制
增加了泛型编程的机制(template)
增加了异常处理
增加了重载的机制
增加了标准模板库(STL)
1.C++存储类
auto存储类
extern 存储类
mutable 存储类
thread_local 存储类
2.内联(inline)函数
不能包含循环语句和switch语句
3.默认参数值的说明次序
有默认参数的形参必须列在形参列表的最右;
调用时实参与形参的结合次序是从左到右。
(可以在函数原型声明的中给出默认参数值,函数定义时可以不再指定默认值)
4.函数重载必须是形参不同:形参个数不同或者类型不同
5.预处理和宏
1.预处理
#define DEBUG
#ifdef DEBUG//判断DEBUG是否被定义
#ifend
2.宏定义
#define SQR(x)(x*x)
int a,b=3;
a = SQR(b+2);//a=b+2*b+2;
#define SQR(x)((x)*(x))
int a,b=3;
a = SQR(b+2);//a=b+2*b+2;//a=(b+2)*(b+2);
6.动态分配内存
1.使用new动态分配内存,使用delete释放动态申请内存
//类型名 *指针变量 = new类型名;
int *pNum = new int;
//类型名 *指针变量 = new类型名[元素个数];
int i=5;
int *pNum = new int[i];
delete []pNum;//释放动态内存;
2.使用malloc和free
//函数原型:
void malloc(unsigned int size);
void free(void *p);
//eg:
short *p = (*short)malloc(len*sizeof(short));
for(int i=0;i<len;i++)
{
cin>>*(p+i);
}
cout<<p[2]<<endl;
free(p);//释放所申请的动态内存;
7.C++ String类的具体实现
class String
{
public:
String(const char *str = NULL);//通用构造函数;
String(const String &another);//复制构造函数;
~String();//析构函数;
String & operator = (const String &rhs)//赋值函数;
char *m_data;//用于保存字符串;
};
//需要注意:1.判断str是否为NULL;2.赋值前需要给成员变量先申请内存。
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1];
m_data[0] = '/0';
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data, str);
}
}
//将another的成员变量m_data赋值给另一个m_data。
String::String(const String &another)
{
m_data = new char[strlen(another.m_data)+1)];
strcpy(m_data, another);
}
//赋值函数:注意要先判断是否相等
String &String::operator = (const String &rhs)
{
//String A;
//String B=A;
if(this == &rhs)
{
return *this;
}
//删除原来的数据
dalete []m_data;
//新开一块内存
m_data = new char[strlen(rhs.m_data)+1];
strcpy(m_data,rhs.m_data);
return *this;
}
//
String::~String()
{
delete []m_data;
}
8. 链表
已知链表的头结点head,写一个函数把这个链表逆序。
Node *ReverseList(Node *head)
{
if(head==NULL||head->next==NULL)return head;
Node *p1=head,*p2=p1->next,p3=p2->next;
p1->next=NULL;
while(p3!=NULL)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
head=p2;
return head;
}
已知两个链表head1和head2各自有序,请把他们合并成一个依然有序的链表。
Node *Merge(Node *head1,Node *head)
{
if(head1==NULL)return head2;
if(head2==NULL)return head1;
Node *head=NULL,*p1=NULL,*p2=NULL;
if(head1->data<head2->data)
{
head=head1;