C++基础

这篇博客详细介绍了C++的基础知识,包括C++对C的增强、存储类、内联函数、默认参数、函数重载、预处理和宏、动态内存分配、String类、链表操作、字符串逆序、容器和迭代器、const成员函数、静态数据成员、派生类的构造和析构函数、重载、覆盖与隐藏、虚函数、结构体和共用体的sizeof、内存管理方式、函数参数传递方式、函数模板和类模板的使用。
摘要由CSDN通过智能技术生成
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;
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值